{ "version": 3, "sources": ["../../../../../../owl-nest/ulule/features/project/src/public/layout/DetailLayout.tsx", "../../../../../../owl-nest/common/feature-detection/src/positionSticky.ts", "../../../../../../owl-nest/common/confetti/index.ts", "../../../../../../owl-nest/ulule/common/sticky-within/index.ts", "../../../../../../owl-nest/ulule/common/sticky-within/src/useStickyFromContext.ts", "../../../../../../owl-nest/ulule/common/sticky-within/src/stickyContext.ts", "../../../../../../owl-nest/ulule-next/common/layout/src/index.ts", "../../../../../../owl-nest/ulule-next/common/layout/src/backgrounds/index.ts", "../../../../../../owl-nest/ulule-next/common/layout/src/backgrounds/Waves.tsx", "../../../../../../owl-nest/ulule-next/common/layout/src/modals/index.ts", "../../../../../../owl-nest/ulule-next/common/layout/src/modals/FollowProject.tsx", "../../../../../../owl-nest/ulule-next/common/layout/src/modals/Nsfw.tsx", "../../../../../../owl-nest/ulule-next/common/layout/src/modals/ShareProject.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/layout/HeaderLayout.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/views/detail/components/PreviewBar.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/components/LilSam/index.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/components/LilSam/LilSam.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/components/LilSam/useLilSam.ts", "../../../../../../owl-nest/ulule/features/project/src/public/components/Onboarding/useOnboardingStep.ts", "../../../../../../owl-nest/ulule/features/project/src/public/components/LilSam/view/index.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/components/LilSam/view/Accepted.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/components/LilSam/layout/index.ts", "../../../../../../owl-nest/ulule/features/project/src/public/components/LilSam/layout/Coach.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/components/LilSam/layout/Notification.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/components/LilSam/layout/SimpleModal.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/components/LilSam/view/ComingSoon.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/components/LilSam/view/Examples.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/components/LilSam/view/Message.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/components/LilSam/view/OffboardingFunded.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/components/LilSam/view/OffboardingSuccess.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/components/LilSam/view/Submit/index.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/components/LilSam/view/Preview.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/components/LilSam/view/Validated.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/components/LilSam/view/Welcome.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/components/Onboarding/useStep.ts", "../../../../../../owl-nest/ulule/features/project/src/public/views/detail/components/HeroHeader/index.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/views/detail/components/DonationBlock.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/views/detail/components/HeroHeader/Heading.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/views/detail/components/HeroHeader/LiveEvents.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/views/detail/components/HeroHeader/Owner.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/views/detail/components/HeroHeader/PartnerRibbon.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/views/detail/components/HeroHeader/PrimaryMedia.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/views/detail/components/HeroHeader/Statistics.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/views/detail/components/HeroHeader/Orders.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/views/detail/components/HeroHeader/Diptych.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/views/detail/components/AnimateCounter.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/views/detail/components/HeroHeader/Supporters.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/views/detail/components/HeroHeader/DateInfo.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/views/detail/components/HeroHeader/Progress.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/views/detail/components/HeroHeader/Triptych.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/views/detail/components/HeroHeader/SocialActions.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/views/detail/components/HeroHeader/Sponsors.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/views/detail/components/BackersBlock/index.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/views/detail/components/BackersBlock/Share.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/views/detail/components/BackersBlock/ProjectFinanced.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/views/detail/components/BackersBlock/ProjectCancelled.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/views/detail/components/BackersBlock/ProjectFinancedOffboarding.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/views/detail/components/BackersBlock/ProjectFinishedDonationBased.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/views/detail/components/BackersBlock/ProjectNotFinanced.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/views/detail/components/BackersBlock/ContributionsBlock.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/views/detail/components/BackersBlock/Contribution.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/views/detail/components/BackersBlock/RewardList.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/views/detail/components/HeroHeader/hooks.ts", "../../../../../../owl-nest/ulule/features/project/src/public/views/detail/components/Menu.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/layout/PublicLayout.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/views/detail/components/Modal.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/views/detail/components/LaunchShareModal.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/views/detail/components/PaymentDisturbanceModal.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/views/detail/components/RewardModals.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/views/detail/components/PostCampaignModal.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/views/detail/components/RewardModal.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/components/ShareOverlay.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/views/coming-soon/index.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/views/coming-soon/Home/index.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/views/coming-soon/Home/Like.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/views/coming-soon/Home/SuccessMessage.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/views/coming-soon/components/SplashTitle.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/views/coming-soon/Home/Title.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/views/coming-soon/Context.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/views/coming-soon/components/ComingSoonHeader.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/components/BrowserScreenshot.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/views/detail/components/SuggestedProjectsList.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/views/detail/components/SuggestedProject.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/TabRouter.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/views/detail/tabs/backers/index.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/models/fan.ts", "../../../../../../owl-nest/ulule/features/project/src/public/views/detail/components/Backer.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/views/detail/utils/formatBacker.ts", "../../../../../../owl-nest/ulule/features/project/src/public/views/detail/tabs/backers/Follower.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/views/detail/tabs/backers/Sponsor.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/components/Onboarding/index.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/components/Onboarding/view/Welcome.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/components/Onboarding/view/Profile.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/components/Onboarding/components/Progress.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/components/Onboarding/components/Coaching.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/components/Onboarding/components/Actions.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/components/Onboarding/components/Tip.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/components/Onboarding/view/styles.ts", "../../../../../../owl-nest/ulule/features/project/src/public/components/Onboarding/view/Category.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/components/Onboarding/view/CommunityOnboarding.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/components/Onboarding/view/ProjectType.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/components/Onboarding/view/RewardType.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/components/Onboarding/view/Training.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/components/Onboarding/view/Slug.tsx", "../../../../../../owl-nest/ulule/features/project/src/public/components/Onboarding/Layout.tsx", "../../../../../../owl-nest/ulule/features/project/src/actions/channel.ts"], "sourcesContent": ["import * as React from 'react'\nimport * as Redux from 'react-redux'\nimport { useLocation } from 'react-router-dom'\nimport * as jotai from 'jotai'\nimport styled, { css } from 'styled-components'\n\nimport * as plume from '@ulule/owl-kit-components/next'\n\nimport { ConfiguredNavMenu, PM_MENU_WIDTH, Screen } from '@owl-nest/project-manager-nav'\nimport { renderConfetti } from '@owl-nest/confetti'\nimport * as cookie from '@owl-nest/cookie-helper'\nimport * as env from '@owl-nest/config'\nimport { StickyStatus, stickyContext, useStickyFromContext } from '@owl-nest/sticky-within'\nimport { Footer, getNavSectionList } from '@owl-nest/layout'\nimport * as hooks from '@owl-nest/hooks'\nimport * as messages from '@owl-nest/messages'\nimport * as models from '@owl-nest/models'\nimport * as shadow from '@owl-nest/shadow'\nimport { scroll } from '@owl-nest/utils'\nimport * as layout from '@ulule/layout'\n\nimport * as modalAction from '../../actions/modal'\nimport { useDisplayMode } from '../hooks/useDisplayMode'\nimport { useNavigation } from '../hooks/useNavigation'\nimport * as projectModel from '../models/project'\nimport { RootState } from '../../reducers'\nimport * as UFE from './../../UFE'\n\nimport { DisplayMode } from '../context'\nimport { HeaderLayout } from './HeaderLayout'\nimport { HeroHeader } from '../views/detail/components/HeroHeader'\nimport { Menu } from '../views/detail/components/Menu'\nimport { PATHS } from '../paths'\nimport { PublicLayout } from './PublicLayout'\nimport { BackersBlock, BlockStatus } from '../views/detail/components/BackersBlock'\nimport { SuggestedProjectsList } from '../views/detail/components/SuggestedProjectsList'\nimport { TabRouter } from '../TabRouter'\nimport { Onboarding } from '../components/Onboarding'\n\nimport { EDIT_MODE_TABLET_BREAKPOINT } from '../views/detail/constants'\n\nconst StickyContextBase = stickyContext(Menu, {\n sticky: (status) => {\n switch (status) {\n case StickyStatus.PreSticky: {\n return css`\n position: absolute;\n top: 0;\n `\n }\n case StickyStatus.Sticky:\n case StickyStatus.PostSticky: {\n return css`\n position: fixed;\n top: 0;\n `\n }\n }\n },\n fallbackToSticky: true,\n})\n\nconst StickyHeaderContext = stickyContext(HeaderLayout, {\n sticky: () => {\n return css``\n },\n fallbackToSticky: true,\n})\n\nexport const SCROLL_TO_ATOM = jotai.atom('')\n\nexport function DetailLayout(): React.ReactElement<unknown> {\n const dispatch = Redux.useDispatch()\n\n const project = Redux.useSelector<RootState, projectModel.Project>((state) => state.application.project.data)\n const userConfig = env.useUserEnv()\n\n const role = models.project.getEditingUserRole(project, UFE.CURRENT_USER.is_staff)\n\n const showOnboarding = models.project.showOnboardingSteps(project)\n const displayMode = useDisplayMode(project)\n const isEditMode = displayMode === 'edit'\n\n const contextRef = React.useRef<HTMLDivElement>(null)\n const stickyStatus = useStickyFromContext(contextRef, { top: -60 })\n const isSticky = stickyStatus !== StickyStatus.PreSticky\n\n const headerContextRef = React.useRef<HTMLDivElement>(null)\n const headerStickyStatus = useStickyFromContext(headerContextRef, { top: 10 })\n const isHeaderSticky = headerStickyStatus === StickyStatus.Sticky\n\n const setScrollTo = jotai.useSetAtom(SCROLL_TO_ATOM)\n const setIsProjectDetailLaunchShareModalOpen = hooks.useSetModal('ProjectDetailLaunchShare')\n\n const navigation = useNavigation()\n const location = useLocation()\n\n const { href, search } = window.location\n const urlParams = new URLSearchParams(search)\n const hasConfetti = urlParams.has('confettis')\n const messenger = messages.useMessage()\n\n const breakpoint = isEditMode ? EDIT_MODE_TABLET_BREAKPOINT : plume.BREAKPOINTS.TABLET\n\n const isTablet = hooks.useDramaticallyInefficientMediaQuery(breakpoint)\n\n const firstLocationChangeRef = React.useRef(true)\n\n React.useLayoutEffect(() => {\n const locationState = location?.state as any\n\n if (navigation.is(PATHS.PROJECT) && locationState?.scrollTarget !== undefined) {\n setScrollTo(locationState?.scrollTarget)\n } else {\n // When changing tabs, scroll the top of the new active tab into view.\n // To avoid interfering with in-page anchors, we check for hash existence first.\n if (\n (!firstLocationChangeRef.current && !location.hash) ||\n ['#comments/', '#faq/', '#rewards/'].includes(location.hash)\n ) {\n // HACK: `setTimeout` is necessary for Gecko (Firefox), which otherwise may skip the scrolling instruction.\n setTimeout(function () {\n scroll.animatedScrollTo(getOffsetTop(contextRef.current), 100)\n }, 5)\n } else {\n setScrollTo('')\n }\n }\n\n firstLocationChangeRef.current = false\n }, [location])\n\n React.useEffect(() => {\n const toast = new URLSearchParams(window.location.search).get('toast')\n\n if (toast) {\n messenger.confirm({\n context: 'from-url-param',\n forceClose: true,\n message: toast,\n type: 'toast',\n })\n }\n\n const rewardId = new URLSearchParams(window.location.search).get('reward')\n if (rewardId) {\n dispatch(modalAction.setRewardId(rewardId))\n dispatch(modalAction.toggleModalReward(true))\n }\n\n const launch = new URLSearchParams(window.location.search).get('launch')\n\n if (launch) {\n setIsProjectDetailLaunchShareModalOpen(true)\n }\n }, [])\n\n React.useEffect(() => {\n // check url parameters\n if (!hasConfetti) {\n return\n } else {\n urlParams.delete('confettis')\n // replace url parameters\n const newUrl = href.replace(search.substring(1), urlParams.toString())\n window.history.replaceState({}, '', newUrl)\n // confetti\n renderConfetti()\n }\n }, [])\n\n // TODO: IMPROVEMENT: This should be a global behaviour (as in the good old `features/init`)\n const { sendBrandsOnPage } = shadow.usePartnershipTracker(undefined, { current: null }, {})\n React.useEffect(() => {\n sendBrandsOnPage()\n }, [])\n\n if (models.project.isCancelled<projectModel.ExtraFields>(project)) {\n return (\n <DisplayMode.Provider value={displayMode}>\n <CancelledWrapper isEditMode={isEditMode}>\n <HeaderLayout isHeaderSticky={isHeaderSticky} />\n <BackersBlock status={BlockStatus.CANCELLED} />\n </CancelledWrapper>\n\n {isTablet && isEditMode && (\n <TabletNavMenuContainer>\n <ConfiguredNavMenu\n mobileBreakpoint={isEditMode ? EDIT_MODE_TABLET_BREAKPOINT : undefined}\n project={project}\n role={role}\n screen={Screen.MY_PROJECT}\n />\n </TabletNavMenuContainer>\n )}\n <LayoutWrapper isEditMode={isEditMode}>\n <AppWrapper isEditMode={isEditMode}>\n <PublicLayout>\n <SuggestedProjectsList isEditMode={isEditMode} />\n </PublicLayout>\n </AppWrapper>\n </LayoutWrapper>\n <Footer lang={userConfig.lang} navSections={getNavSectionList(userConfig.lang)} />\n </DisplayMode.Provider>\n )\n }\n\n return (\n <DisplayMode.Provider value={displayMode}>\n <StyledToastDisplayer contexts={['from-url-param']} position=\"top\" />\n {project.nsfw && cookie.getCookie(`accept_pegi_18_${project.id}`) !== 'true' && (\n <layout.modals.Nsfw\n onBack={() => {\n window.location.href = '/'\n }}\n projectId={project.id}\n projectName={models.project.name(project) ?? ''}\n projectSlug={project.slug}\n />\n )}\n <StickyHeaderContext status={headerStickyStatus}>\n <div ref={headerContextRef} />\n <HeaderLayout isHeaderSticky={isHeaderSticky} />\n <HeroHeader />\n </StickyHeaderContext>\n\n {isTablet && isEditMode && (\n <TabletNavMenuContainer>\n <ConfiguredNavMenu\n project={project}\n role={role}\n screen={Screen.MY_PROJECT}\n mobileBreakpoint={isEditMode ? EDIT_MODE_TABLET_BREAKPOINT : undefined}\n />\n </TabletNavMenuContainer>\n )}\n\n <LayoutWrapper isEditMode={isEditMode}>\n {/* This ref is needed to make a scroll to the tabPanel on path change */}\n <div ref={contextRef} />\n <AppWrapper isEditMode={isEditMode}>\n <PublicLayout>\n <StickyContext status={stickyStatus}>\n <Menu sticky={isSticky} />\n <TabRouter />\n </StickyContext>\n </PublicLayout>\n </AppWrapper>\n </LayoutWrapper>\n {/* @ts-expect-error ExtraFields mismatch */}\n {showOnboarding && <Onboarding project={project} />}\n <Footer lang={userConfig.lang} navSections={getNavSectionList(userConfig.lang)} />\n </DisplayMode.Provider>\n )\n}\n\nconst StyledToastDisplayer = styled(messages.ToastDisplayer)`\n z-index: ${plume.ZINDEX.MODAL};\n top: ${plume.SIZES.HEADER_DESKTOP_HEIGHT};\n`\n\nconst TabletNavMenuContainer = styled.div`\n position: absolute;\n top: 60px;\n width: ${PM_MENU_WIDTH};\n`\n\nconst CancelledWrapper = styled.div<{ isEditMode: boolean }>`\n ${({ isEditMode }) =>\n isEditMode &&\n css`\n @media screen and ${EDIT_MODE_TABLET_BREAKPOINT} {\n border-left: 1px solid ${plume.COLORS.PRIMARY_SAND};\n margin-left: ${PM_MENU_WIDTH};\n }\n `};\n`\n\nconst AppWrapper = styled.main<{ isEditMode: boolean }>`\n width: 100%;\n\n ${({ isEditMode }) =>\n isEditMode &&\n css`\n @media screen and ${EDIT_MODE_TABLET_BREAKPOINT} {\n border-left: 1px solid ${plume.COLORS.PRIMARY_SAND};\n }\n `}\n`\n\nconst LayoutWrapper = styled.div<{ isEditMode: boolean }>`\n display: flex;\n position: relative;\n z-index: 2;\n\n ${({ isEditMode }) =>\n isEditMode &&\n css`\n @media screen and ${EDIT_MODE_TABLET_BREAKPOINT} {\n left: ${PM_MENU_WIDTH};\n width: calc(100% - ${PM_MENU_WIDTH});\n }\n `}\n`\n\nconst StickyContext = styled(StickyContextBase)`\n z-index: 0;\n\n ${Menu} {\n z-index: ${plume.ZINDEX.NAVIGATION_MENU};\n left: 0;\n right: 0;\n }\n`\n\nfunction getOffsetTop(element: any): number {\n return element ? element.offsetTop + getOffsetTop(element.offsetParent) : 0\n}\n", "import { memoize } from './memoize'\n\nfunction detect(): boolean {\n const prop = 'position:'\n const value = 'sticky'\n const prefixes = ' -webkit- -moz- -o- -ms- '.split(' ')\n\n const el = document.createElement('a')\n const mStyle = el.style\n mStyle.cssText = prop + prefixes.join(value + ';' + prop).slice(0, -prop.length)\n\n return mStyle.position.indexOf(value) !== -1\n}\n\nexport const positionSticky = memoize(detect)\n", "import { COLORS, ZINDEX } from '@ulule/owl-kit-components/next'\n\nconst params = {\n colors: [COLORS.PRIMARY_BLUE_500, COLORS.SECONDARY_GREEN_500, COLORS.BRAND_INDIGO, COLORS.SECONDARY_PURPLE],\n disableForReducedMotion: true,\n startVelocity: 30,\n spread: 360,\n ticks: 60,\n zIndex: ZINDEX.HIGH,\n}\n\nlet confettiPromise: Promise<any> | undefined = undefined\n\nexport async function renderConfetti(canvas?: any): Promise<void> {\n if (confettiPromise === undefined) {\n //@ts-expect-error: no type definition for this module\n confettiPromise = import('canvas-confetti')\n }\n\n const end = Date.now() + 3 * 1000\n const { default: confetti } = await confettiPromise\n\n if (canvas !== undefined && canvas.confetti === undefined) {\n canvas.confetti = confetti.create(canvas, { resize: true })\n }\n\n const interval: number = window.setInterval(async () => {\n if (Date.now() > end) {\n return clearInterval(interval)\n }\n\n const confettiParams = {\n ...params,\n origin: {\n x: Math.random(),\n y: Math.random() - 0.2,\n },\n }\n\n if (canvas !== undefined) {\n canvas.confetti(confettiParams)\n } else {\n confetti(confettiParams)\n }\n }, 150 + Math.random() * 150)\n}\n", "export { useStickyWithinContext } from './src/useStickyWithinContext'\nexport { useStickyFromContext } from './src/useStickyFromContext'\nexport { stickyContext } from './src/stickyContext'\nexport { StickyStatus } from './src/types'\n", "import * as React from 'react'\n\nimport { StickyStatus, Offset } from './types'\n\nexport function useStickyFromContext(contextRef: React.RefObject<HTMLElement>, { top = 0 }: Offset = {}): StickyStatus {\n const [state, setState] = React.useState<StickyStatus>(StickyStatus.PreSticky)\n\n React.useEffect(() => {\n window.addEventListener('scroll', onScroll)\n return () => {\n window.removeEventListener('scroll', onScroll)\n }\n }, [])\n\n return state\n\n function onScroll() {\n if (contextRef.current === null) {\n return\n }\n\n const contextBox = contextRef.current.getBoundingClientRect()\n\n setState(state => {\n switch (state) {\n case StickyStatus.PreSticky:\n {\n // if we are not yet sticky and the top of the context exits the viewport from\n // the top (meaning we scrolled downard enough to become sticky) then the\n // target become \"fixed\" to the top of the viewport (sticky-like behaviour)\n if (contextBox.top + top < 0) {\n return StickyStatus.Sticky\n }\n }\n break\n case StickyStatus.Sticky:\n {\n // if we are sticky and the top of the context enters the viewport from\n // the top (meaning we scrolled upward enough to overflow the context)\n // then the targets stops being stick and its position if fixed to the\n // top of the context with 'absolute' positioning\n if (contextBox.top + top > 0) {\n return StickyStatus.PreSticky\n }\n }\n break\n }\n return state\n })\n }\n}\n", "import styled, { css, StyledComponent, FlattenSimpleInterpolation } from 'styled-components'\nimport { StickyStatus, Offset } from './types'\nimport * as supports from '@owl-nest/feature-detection'\n\ntype StickyContextConfig = {\n sticky?: (status: StickyStatus) => FlattenSimpleInterpolation\n fallbackToSticky?: boolean\n}\n\ntype StickyContextProps = {\n status: StickyStatus\n $offset?: Offset\n}\n\nexport function stickyContext(\n StickyComponent: StyledComponent<any, any, any, any>,\n { sticky, fallbackToSticky = false }: StickyContextConfig,\n): StyledComponent<'div', any, StickyContextProps, never> {\n return styled.div<StickyContextProps>`\n position: relative;\n\n ${StickyComponent} {\n ${({ status, $offset = { top: 0 } }) => {\n if (supports.positionSticky() && fallbackToSticky) {\n return css`\n position: sticky;\n top: ${$offset.top}px;\n bottom: ${$offset.bottom}px;\n background-color: #fff;\n `\n }\n return sticky && sticky(status)\n }}\n }\n `\n}\n", "export * as backgrounds from './backgrounds'\nexport * as modals from './modals'\n", "export * from './Waves'\n", "import * as React from 'react'\nimport styled from 'styled-components'\n\nimport * as plume from '@ulule/owl-kit-components/next'\n\nexport function Waves(): React.ReactElement {\n return (\n <WavesContainer>\n <WavesSvg viewBox=\"0 0 1225 1142\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M532.816 477.314C655.383 548.116 772.572 455.191 900.329 510.02C966.801 538.547 986.132 565.879 1040.31 610.194C1075.05 638.618 1079 643.649 1110.1 663.735C1141.21 683.82 1193.86 706.393 1193.86 706.393L1214.84 783.662L12.9963 830.681L-126.767 315.932L160.025 304.712C160.025 304.712 312.543 296.289 403.217 357.21C458.366 394.263 470.073 441.07 532.816 477.314Z\"\n fill=\"#D1EDF7\"\n />\n <path\n d=\"M509.698 518.992C632.253 589.39 744.194 477.787 871.939 532.302C938.404 560.666 998.453 668.015 1024.13 699.431C1038.2 716.645 1056.68 731.912 1083.04 743.32C1109.4 754.727 1170.69 746.76 1170.69 746.76L1191.66 823.589L-10.0997 870.347L-141.056 390.672L127.862 380.209C127.862 380.209 314.76 366.721 388.161 408.396C452.22 444.767 446.961 482.955 509.698 518.992Z\"\n fill=\"#E7F8FC\"\n />\n </WavesSvg>\n </WavesContainer>\n )\n}\n\nconst WavesContainer = styled.div`\n bottom: 0;\n height: 500px;\n overflow: hidden;\n position: absolute;\n width: 100%;\n z-index: -1;\n`\n\nconst WavesSvg = styled.svg`\n bottom: -375px;\n position: absolute;\n width: 1050px;\n\n @media screen and ${plume.BREAKPOINTS.TABLET} {\n bottom: -325px;\n width: 850px;\n left: -150px;\n }\n\n @media screen and ${plume.BREAKPOINTS.LAPTOP} {\n bottom: -400px;\n width: 980px;\n left: -100px;\n }\n\n @media screen and ${plume.BREAKPOINTS.LAPTOP_L} {\n bottom: -440px;\n width: 65%;\n max-width: 1100px;\n left: 0px;\n }\n\n @media screen and (min-width: 1920px) {\n bottom: -540px;\n width: 65%;\n max-width: 1300px;\n }\n`\n", "export * from './FollowProject'\nexport * from './Nsfw'\nexport * from './ShareProject'\n", "import * as React from 'react'\nimport styled from 'styled-components'\n\nimport { t, tc } from '@owl-nest/localize'\nimport * as services from '@owl-nest/services'\nimport { searchParams } from '@owl-nest/utils'\nimport * as plume from '@ulule/owl-kit-components/next'\nimport * as env from '@owl-nest/config'\n\ntype FollowProjectProps = {\n followImage?: {\n '1x': string\n '2x': string\n '3x': string\n }\n isOpen: boolean\n onClose: () => void\n}\n\nexport function FollowProject({ isOpen, onClose }: FollowProjectProps): React.ReactElement<FollowProjectProps> {\n const auth = services.user.useAuth()\n\n return (\n <ModalWithIcon\n closable\n open={isOpen}\n onClose={onClose}\n icon={<plume.illustrations.twoToned.EnvelopeWithHeart size={120} noBackground />}\n svgScale={0.825}\n >\n <ModalContent>\n <>\n {auth.type === 'loggedin' ? (\n <>\n <plume.styles.heading.XXS>{t('Project followed')}</plume.styles.heading.XXS>\n <plume.styles.copy.S>\n {t('You will receive project posts and be notified by email 48 hours before the end of the project.')}\n </plume.styles.copy.S>\n <plume.Button onClick={onClose}>{t('Ok, thanks')}</plume.Button>\n </>\n ) : (\n <>\n <plume.styles.heading.XXS>{t('Follow this project')}</plume.styles.heading.XXS>\n <plume.styles.copy.S>\n {tc(\n `[loginLink: Log in] to your Ulule account to follow this project. Don't have an account? [signupLink: Sign up] now.`,\n {\n loginLink: <plume.Link href={nextAwareURL(env.SIGNIN_URL)} tinted />,\n signupLink: <plume.Link href={nextAwareURL(env.SIGNUP_URL)} tinted />,\n },\n )}\n </plume.styles.copy.S>\n <br />\n <plume.styles.copy.XS>\n <plume.Link kind=\"secondary\" onClick={() => onClose()}>\n {t('Later')}\n </plume.Link>\n </plume.styles.copy.XS>\n </>\n )}\n </>\n </ModalContent>\n </ModalWithIcon>\n )\n}\n\nfunction nextAwareURL(url: string): string {\n if (typeof window === 'undefined') {\n return url\n }\n\n const params = { next: window.location.href }\n return searchParams.addSearchParamsToUrl(url, params)\n}\n\nconst ModalWithIcon = styled(plume.ModalWithIcon)``\n\nconst ModalContent = styled.div`\n text-align: center;\n\n ${plume.Button} {\n margin-top: 30px;\n }\n\n ${plume.styles.heading.XXS} {\n margin-bottom: 10px;\n margin-top: 10px;\n }\n`\n", "import * as React from 'react'\nimport styled from 'styled-components'\n\nimport * as cookie from '@owl-nest/cookie-helper'\nimport * as dateUtil from '@owl-nest/date'\nimport * as hooks from '@owl-nest/hooks'\nimport { t, tc } from '@owl-nest/localize'\nimport * as plume from '@ulule/owl-kit-components/next'\n\ntype NsfwProps = {\n onBack: () => void\n projectId: number\n projectName: string\n projectSlug: string\n}\n\nexport function Nsfw({ onBack, projectId, projectName, projectSlug }: NsfwProps): React.ReactElement {\n hooks.useModalInitialValue('Nsfw', { open: true })\n const [isOpen, setIsOpen] = hooks.useModal('Nsfw')\n\n plume.hooks.useScrollLock(isOpen)\n\n const isClientSide = hooks.useClientSide() // HACK: This is a dumb workaround to avoid SSR issues with buttons, remove when fixed\n const isMobile = isClientSide ? plume.utils.isMobile() : false\n\n return (\n <ModalWithIcon\n open={isOpen}\n closable={false}\n onClose={() => {\n setIsOpen(false)\n cookie.setCookie(`accept_pegi_18_${projectId}`, 'true', {\n expires: dateUtil.addDays(Date.now(), 365).toUTCString(),\n path: `/${projectSlug}`,\n })\n }}\n icon={<plume.illustrations.twoToned.Nsfw size={isMobile ? 72 : 120} inverted noBackground />}\n forceInitMount\n showMobileIcon\n buttons={\n isClientSide\n ? [\n {\n type: 'button',\n props: {\n children: t('Continue'),\n onClick: () => {\n setIsOpen(false)\n cookie.setCookie(`accept_pegi_18_${projectId}`, 'true', {\n expires: dateUtil.addDays(Date.now(), 365).toUTCString(),\n path: `/${projectSlug}`,\n })\n },\n },\n },\n { type: 'link', props: { children: t('Back to home page'), kind: 'secondary', onClick: onBack } },\n ]\n : undefined\n }\n >\n <Heading>{t('Explicit content')}</Heading>\n <plume.styles.copy.M>\n {tc(\n 'Please be aware that the content of [strong: %(projectName)s] is intended for an adult audience. By continuing, you testify being 18 years old or more.',\n { strong: <strong />, projectName },\n )}\n </plume.styles.copy.M>\n </ModalWithIcon>\n )\n}\n\nconst ModalWithIcon = styled(plume.ModalWithIcon)`\n backdrop-filter: blur(12px);\n\n @media screen and ${plume.BREAKPOINTS.TABLET} {\n ${plume.ModalIconWrapper} {\n background-color: ${plume.COLORS.SECONDARY_GREEN_800};\n }\n }\n`\n\nconst Heading = styled(plume.styles.heading.S)`\n margin-bottom: 8px;\n text-align: center;\n`\n", "import * as React from 'react'\n\nimport styled, { css } from 'styled-components'\n\nimport * as api from '@owl-nest/api-client/next'\nimport { renderConfetti } from '@owl-nest/confetti'\nimport * as copier from '@owl-nest/copier'\nimport * as hooks from '@owl-nest/hooks'\nimport { t } from '@owl-nest/localize'\nimport * as shadow from '@owl-nest/shadow'\nimport * as sharing from '@owl-nest/sharing'\nimport * as service from '@owl-nest/services'\nimport * as plume from '@ulule/owl-kit-components/next'\n\ntype ShareModalProps = {\n closable?: boolean\n enableConfetti?: boolean\n enableWidget?: boolean\n modalButtons?: plume.ModalButtons\n modalPastille?: React.ReactElement\n modalHero?: React.ReactElement\n modalId?: 'ProjectDetailShare' | 'ProjectDetailLaunchShare'\n project: api.Project\n publicUser?: api.PublicUser\n sharingContext?: string\n trackingConfig: {\n category: shadow.CATEGORY\n source: string\n }\n withCallout?: boolean\n}\n\nconst ProjectWidgetPreview = React.lazy(async () => ({ default: (await import('@ulule/duvet')).ProjectWidgetPreview }))\n\nexport function ShareProject(props: ShareModalProps) {\n const auth = service.user.useAuth()\n\n return <UserWiredShareProject {...props} publicUser={auth.type === 'loggedin' ? auth.user : props.publicUser} />\n}\n\nfunction UserWiredShareProject({\n closable = true,\n enableConfetti = false,\n enableWidget = true,\n modalButtons,\n modalHero = <plume.styles.heading.L>{t('Share project')}</plume.styles.heading.L>,\n modalId = 'ProjectDetailShare',\n modalPastille = <plume.illustrations.twoToned.Share size={plume.utils.isMobile() ? 52 : 120} />,\n project,\n publicUser,\n sharingContext = 'project-page',\n trackingConfig,\n withCallout = false,\n}: ShareModalProps): React.ReactElement {\n const { canCopy, copy, copyStatus } = copier.useCopy(4000)\n const { shareTo } = sharing.useSharing(sharingContext, project, publicUser)\n const tracking = shadow.useTracking()\n\n const [isProjectDetailShareModalOpen, setIsProjectDetailShareModalOpen] = hooks.useModal(modalId)\n const [isWidgetOpen, setIsWidgetOpen] = React.useState(false)\n\n plume.hooks.useScrollLock(isProjectDetailShareModalOpen, { lockClassName: 'no-scroll' })\n\n React.useEffect(() => {\n if (enableConfetti && isProjectDetailShareModalOpen) {\n const canvas = document.getElementById('confettis-canvas')\n renderConfetti(canvas)\n }\n }, [isProjectDetailShareModalOpen])\n\n const projectURL = sharing.getSharingURL(sharingContext, 'clipboard', project, publicUser)\n\n return (\n <ModalWithIcon\n buttons={modalButtons}\n closable={closable}\n onClose={() => {\n setIsProjectDetailShareModalOpen(false)\n }}\n open={isProjectDetailShareModalOpen}\n withCallout={withCallout}\n icon={modalPastille}\n svgScale={0.8}\n >\n <OverflowWrapper isWidgetOpen={isWidgetOpen}>\n {enableConfetti && <CanvasConfetti id=\"confettis-canvas\" />}\n\n {modalHero}\n\n <Copy>\n <plume.TextField value={projectURL} disabled />\n <plume.LinkAsButton\n type=\"button\"\n tinted\n withIcon\n onClick={() => {\n if (canCopy) {\n copy(projectURL)\n track(shadow.SOCIAL_NETWORK.HYPERLINK)\n }\n }}\n >\n <plume.glyphs.stroke.Link size={20} />\n {t('Copy link')}\n </plume.LinkAsButton>\n\n <plume.Tooltip open={copyStatus === 'succeeded'} position={'bottom'} fitToContent>\n <plume.styles.copy.S>{t('Link copied to your clipboard.')}</plume.styles.copy.S>\n </plume.Tooltip>\n </Copy>\n\n <Links>\n <plume.Link\n withIcon\n className=\"lauch-share-modal-linkedin\"\n onClick={() => {\n shareTo('linkedin', { eventCategory: trackingConfig.category, eventLabel: trackingConfig.source })\n }}\n >\n <plume.glyphs.thirdParty.Linkedin size={16} />\n Linkedin\n </plume.Link>\n\n <plume.Link\n withIcon\n className=\"lauch-share-modal-whatsapp\"\n onClick={() =>\n shareTo('whatsapp', { eventCategory: trackingConfig.category, eventLabel: trackingConfig.source })\n }\n >\n <plume.glyphs.thirdParty.WhatsApp size={16} />\n WhatsApp\n </plume.Link>\n\n <plume.Link\n withIcon\n className=\"lauch-share-modal-facebook\"\n onClick={() =>\n shareTo('facebook', { eventCategory: trackingConfig.category, eventLabel: trackingConfig.source })\n }\n >\n <plume.glyphs.thirdParty.Facebook size={16} />\n Facebook\n </plume.Link>\n\n <plume.Link\n withIcon\n className=\"lauch-share-modal-messenger\"\n onClick={() =>\n shareTo('messenger', { eventCategory: trackingConfig.category, eventLabel: trackingConfig.source })\n }\n >\n <plume.glyphs.thirdParty.Messenger size={16} />\n Messenger\n </plume.Link>\n\n <plume.Link\n withIcon\n className=\"lauch-share-modal-twitter\"\n onClick={() =>\n shareTo('twitter', { eventCategory: trackingConfig.category, eventLabel: trackingConfig.source })\n }\n >\n <plume.glyphs.thirdParty.Twitter size={16} />\n Twitter\n </plume.Link>\n\n {enableWidget && (\n <plume.Link\n withIcon\n className=\"lauch-share-modal-widget\"\n onClick={() => {\n setIsWidgetOpen(!isWidgetOpen)\n track(shadow.SOCIAL_NETWORK.WIDGET)\n }}\n >\n <plume.glyphs.stroke.CodeBlock size={18} />\n {t('Embed widget')}\n </plume.Link>\n )}\n </Links>\n\n {enableWidget && (\n <React.Suspense fallback={<plume.Spinner />}>\n <Widget open={isWidgetOpen}>\n <ProjectWidgetPreview url={`${project.absolute_url}widget.html`} />\n </Widget>\n </React.Suspense>\n )}\n </OverflowWrapper>\n </ModalWithIcon>\n )\n\n function track(kind: shadow.SOCIAL_NETWORK): void {\n tracking.social.track({\n eventCategory: trackingConfig.category,\n eventLabel: trackingConfig.source,\n socialAction: 'click: Share',\n socialNetwork: kind,\n socialTarget: project.absolute_url,\n })\n }\n}\n\nconst OverflowWrapper = styled.div<{ isWidgetOpen: boolean }>`\n overflow: ${({ isWidgetOpen }) => (isWidgetOpen ? 'auto' : 'initial')};\n width: 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n max-height: 75vh;\n`\n\nconst CanvasConfetti = styled.canvas`\n height: 170px;\n left: 0;\n position: absolute;\n top: 0;\n width: 100%;\n z-index: 0;\n`\n\nconst ModalWithIcon = styled(plume.ModalWithIcon)<{ withCallout: boolean }>`\n ${plume.styles.modal.Body}:not(${plume.styles.modal.Actions}) {\n align-items: center;\n display: flex;\n flex-direction: column;\n justify-content: center;\n padding-bottom: 40px;\n }\n\n ${plume.styles.modal.Actions} button {\n width: fit-content;\n }\n\n ${plume.illustrations.Illustration} {\n position: relative;\n z-index: 1;\n }\n\n ${plume.styles.heading.L} {\n margin-top: 13px;\n margin-bottom: 32px;\n position: relative;\n z-index: 1;\n }\n\n ${plume.styles.copy.M} {\n margin-bottom: ${({ withCallout }) => (withCallout ? '20px' : '32px')};\n }\n\n ${plume.Link} {\n ${plume.glyphs.Icon} {\n margin-right: 5px;\n }\n }\n\n ${plume.glyphs.thirdParty.Linkedin} {\n color: ${plume.COLORS.TERTIARY_LINKEDIN};\n }\n\n ${plume.glyphs.thirdParty.WhatsApp} {\n color: ${plume.COLORS.TERTIARY_WHATSAPP};\n }\n\n ${plume.glyphs.thirdParty.Facebook} {\n color: ${plume.COLORS.TERTIARY_FACEBOOK};\n }\n\n ${plume.glyphs.thirdParty.Messenger} {\n color: ${plume.COLORS.TERTIARY_MESSENGER};\n }\n\n ${plume.glyphs.thirdParty.Twitter} {\n color: ${plume.COLORS.TERTIARY_X};\n }\n\n ${plume.glyphs.stroke.CodeBlock} {\n color: ${plume.COLORS.PRIMARY_SAND_500};\n }\n\n @media screen and ${plume.BREAKPOINTS.TABLET} {\n ${plume.styles.copy.M} {\n margin-bottom: ${({ withCallout }) => (withCallout ? '20px' : '32px')};\n width: 546px;\n }\n\n ${plume.styles.modal.Body}:not(${plume.styles.modal.Actions}) {\n padding-bottom: 40px;\n }\n\n ${plume.styles.modal.Wrapper} {\n max-width: 734px;\n width: 100%;\n position: relative;\n\n // HACK: remove this when we correct the zindex issue on project page with all modales\n ${({ open }) => {\n if (open) {\n return css`\n max-height: 100%; //HACK: but don't remove this when we correct the zindex issue\n `\n }\n }}\n }\n\n ${plume.styles.copy.M} {\n width: 546px;\n }\n }\n`\n\nconst Copy = styled.div`\n align-items: center;\n display: flex;\n margin-bottom: 34px;\n position: relative;\n flex-direction: column;\n width: 100%;\n\n ${plume.glyphs.stroke.Link} {\n color: ${({ theme }) => theme?.colors?.primary ?? plume.COLORS.PRIMARY_BLUE_500};\n }\n\n ${plume.TextField} {\n width: 100%;\n }\n\n @media screen and ${plume.BREAKPOINTS.TABLET} {\n min-width: 470px;\n justify-content: center;\n flex-direction: row;\n width: auto;\n\n ${plume.TextField} {\n min-width: 350px;\n width: auto;\n }\n\n ${plume.Tooltip} {\n right: -180px;\n left: auto;\n\n ${plume.styles.copy.S} {\n text-align: center;\n }\n }\n }\n`\n\nconst Links = styled.div`\n align-items: center;\n display: flex;\n flex-wrap: wrap;\n gap: 24px 16px;\n justify-content: space-evenly;\n max-width: 272px;\n\n @media screen and ${plume.BREAKPOINTS.TABLET} {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n grid-template-rows: repeat(2, 1fr);\n gap: 16px;\n max-width: 100%;\n }\n`\n\nconst Widget = styled.div<{ open: boolean }>`\n display: ${({ open }) => (open ? 'block' : 'none')};\n margin-top: 34px;\n`\n", "import * as React from 'react'\nimport * as Redux from 'react-redux'\nimport styled, { css } from 'styled-components'\n\nimport * as header from '@ulule/header'\nimport { useDramaticallyInefficientMediaQuery } from '@owl-nest/hooks'\nimport { ConfiguredNavMenu, Wrapper, Screen, PM_MENU_WIDTH } from '@owl-nest/project-manager-nav'\nimport { message } from '@owl-nest/redux-wrapper/components'\nimport * as plume from '@ulule/owl-kit-components/next'\nimport * as models from '@owl-nest/models'\nimport * as env from '@owl-nest/config'\nimport * as api from '@owl-nest/api-client/latest'\nimport { useAuth } from '@owl-nest/redux-wrapper/hooks'\n\nimport { useDisplayMode, DisplayMode as DisplayModeType } from '../hooks/useDisplayMode'\nimport * as projectModel from '../models/project'\nimport { RootState } from '../../reducers'\nimport * as UFE from '../../UFE'\n\nimport { PreviewBar } from '../views/detail/components/PreviewBar'\n\nimport { EDIT_MODE_TABLET_BREAKPOINT } from '../views/detail/constants'\nimport { LilSam } from '../components/LilSam'\n\ntype HeaderLayoutProps = {\n headerRef?: React.Ref<HTMLElement>\n className?: string\n isHeaderSticky?: boolean\n}\n\nexport function HeaderLayoutComponent({\n headerRef,\n className,\n isHeaderSticky,\n}: HeaderLayoutProps): React.ReactElement<HeaderLayoutProps> {\n const project = Redux.useSelector<RootState, projectModel.Project>((state) => state.application.project.data)\n\n const role = models.project.getEditingUserRole(project, UFE.CURRENT_USER.is_staff)\n const userConfig = env.useUserEnv()\n\n const stickyRefHeader = React.useRef<HTMLDivElement>(null)\n\n const displayMode = useDisplayMode(project)\n const isEditMode = displayMode === 'edit'\n\n const breakpoint = isEditMode ? EDIT_MODE_TABLET_BREAKPOINT : plume.BREAKPOINTS.TABLET\n\n const isTablet = useDramaticallyInefficientMediaQuery(breakpoint)\n\n const auth = useAuth()\n const isOwner = auth.type === 'loggedin' && auth.user.id === project.owner.id\n\n // If owner menu is visible or the custom color is white, set color to blue.\n // Otherwise, use color chosen by user.\n const backgroundColor = project.background_color?.[userConfig.lang]\n const theme = {\n colors: {\n primary: isEditMode\n ? plume.COLORS.PRIMARY_BLUE_500\n : backgroundColor && plume.COLORS.hexToRgb(backgroundColor, 0) !== 'rgb(255,255,255)'\n ? backgroundColor\n : plume.COLORS.PRIMARY_BLUE_500,\n },\n }\n\n function setRef(node: HTMLDivElement): void {\n ;(stickyRefHeader as any).current = node\n if (headerRef) {\n if (typeof headerRef === 'function') {\n headerRef(node)\n } else {\n ;(headerRef as any).current = node\n }\n }\n }\n\n return (\n <HeaderWrapper ref={setRef} displayMode={displayMode} className={className}>\n {displayMode === 'preview' && <PreviewBar />}\n <header.Header theme={theme} enableSubnav={false} />\n\n {isEditMode && !isTablet && (\n <ConfiguredNavMenu\n mobileBreakpoint={isEditMode ? EDIT_MODE_TABLET_BREAKPOINT : undefined}\n project={project}\n role={role}\n screen={Screen.MY_PROJECT}\n />\n )}\n\n {displayMode !== 'preview' && (\n <BannerContainer isEditMode={isEditMode} breakpoint={breakpoint}>\n <message.Banner\n key=\"error-alert\"\n contexts={[\n 'bo.success',\n 'extratime',\n 'extratime_billing',\n 'extratime_ended',\n 'funded',\n 'funded_billing',\n 'mobile',\n 'pending-changes',\n ]}\n />\n </BannerContainer>\n )}\n\n <HiddenOnSticky isHidden={isHeaderSticky}>\n {isOwner && project.status !== api.ProjectStatus.REFUSED && <LilSam />}\n </HiddenOnSticky>\n </HeaderWrapper>\n )\n}\nexport const HeaderLayout = styled(HeaderLayoutComponent)``\n\nconst BannerContainer = styled.div<{ isEditMode: boolean; breakpoint: string }>`\n position: absolute;\n z-index: 0;\n\n @media screen and ${({ breakpoint }) => breakpoint} {\n margin-left: ${({ isEditMode }) => (isEditMode ? PM_MENU_WIDTH : '0')};\n width: ${({ isEditMode }) => (isEditMode ? `calc(100% - ${PM_MENU_WIDTH})` : '100%')};\n }\n`\n\nconst HiddenOnSticky = styled.div<{ isHidden?: boolean }>`\n opacity: 1;\n position: absolute;\n top: 0px;\n transition: 0.1s;\n width: 100%;\n z-index: ${plume.ZINDEX.NAVIGATION_MENU};\n display: none;\n\n @media screen and ${EDIT_MODE_TABLET_BREAKPOINT} {\n display: block;\n }\n\n ${({ isHidden }) => {\n if (isHidden) {\n return css`\n opacity: 0;\n top: -5px;\n `\n } else {\n return css`\n opacity: 1;\n `\n }\n }};\n`\n\nconst HeaderWrapper = styled.div<{ displayMode: DisplayModeType }>`\n pointer-events: none;\n z-index: ${plume.ZINDEX.HEADER};\n\n ${header.styles.HeaderContent}, ${BannerContainer}, ${Wrapper}, ${HiddenOnSticky} {\n pointer-events: all;\n }\n`\n", "import * as React from 'react'\nimport * as Redux from 'react-redux'\nimport { useLocation } from 'react-router'\n\nimport * as layout from '@owl-nest/layout'\nimport * as model from '@owl-nest/models'\n\nimport * as projectModel from '../../../models/project'\nimport { RootState } from '../../../../reducers'\nimport * as modalActions from '../../../../actions/modal'\n\nexport function PreviewBar(): React.ReactElement<unknown> {\n const project = Redux.useSelector<RootState, projectModel.Project>((state) => state.application.project.data)\n const dispatch = Redux.useDispatch()\n\n const { search } = useLocation()\n const urlSearchParams = new URLSearchParams(search)\n const previousEditionPath = urlSearchParams.get('prev')\n\n return (\n <layout.PreviewBar\n previousEditionPath={previousEditionPath ?? `/${project.slug}/`}\n onShare={model.project.isComingSoonEnabled(project) ? () => shareProject() : undefined}\n />\n )\n\n function shareProject(): void {\n dispatch(modalActions.toggleShareOverlay(true))\n }\n}\n", "import * as React from 'react'\nimport * as Redux from 'react-redux'\nimport { Dispatch } from 'redux'\n\nimport { LilSam as BaseLilSam } from './LilSam'\nimport type { Rule } from './useLilSam'\nimport * as api from '@owl-nest/api-client/latest'\nimport * as models from '@owl-nest/models'\n\nimport * as projectModel from '../../models/project'\nimport * as projectAction from '../../../actions/project'\nimport { RootState } from '../../../reducers'\nimport * as view from './view'\nimport { useAuth } from '@owl-nest/redux-wrapper/hooks'\nimport { useLocation } from 'react-router-dom'\nimport { isPreview } from '../../hooks/useDisplayMode'\nimport { useStep } from '../Onboarding/useStep'\n\nexport function LilSam(): React.ReactElement<unknown> {\n const dispatch = Redux.useDispatch<Dispatch>()\n const project = Redux.useSelector<RootState, projectModel.Project>((state) => state.application.project.data)\n const discussionThread = project.thread || undefined\n\n const location = useLocation()\n const auth = useAuth()\n const user = auth.type === 'loggedin' ? auth.user : undefined\n\n // @ts-expect-error ExtraFields mismatch\n const { isDone: isOnboardingDone } = useStep(project)\n\n const rule: Rule = async (steps, setStep) => {\n // /!\\ `content` variable might be set in multiple conditions, in a \"fall through\" manner.\n // The last matching condition takes precedence.\n let content: () => Promise<React.ReactNode | undefined> = () => Promise.resolve(undefined)\n\n // no lilsam if onboarding is not finished\n if (!isOnboardingDone) {\n return <></>\n }\n\n if (!isPreview(location.pathname)) {\n if (\n discussionThread &&\n discussionThread.status === api.DiscussionThreadStatus.UNREAD &&\n user &&\n discussionThread.latest_message.sender.id !== user.id\n ) {\n content = async () => {\n return <view.Message sender={discussionThread.latest_message.sender} project={project} />\n }\n }\n\n // for old project whithout validation_message\n if (project.validation_message === undefined) {\n if (project.status === api.ProjectStatus.VALIDATED && !steps.validated) {\n content = async () => {\n return (\n <view.Validated\n initialOpen={!steps.validated}\n project={project}\n markStepDone={() => setStep('validated', true)}\n />\n )\n }\n }\n }\n\n // for new project with validation_message\n if (project.status === api.ProjectStatus.VALIDATED && project.validation_message !== undefined) {\n if (project.validation_message.read_by_owner) {\n content = async () => {\n return (\n <view.Validated initialOpen={true} project={project} markStepDone={() => setStep('validated', true)} />\n )\n }\n } else if (discussionThread) {\n return <view.Message sender={discussionThread.latest_message.sender} project={project} />\n }\n }\n\n if (project.status === api.ProjectStatus.NEW && !steps.welcome) {\n content = async () => {\n if (!steps.alreadyWelcomeOnce) {\n await new Promise((resolve) => setTimeout(resolve, 5000))\n setStep('alreadyWelcomeOnce', true)\n }\n return (\n <view.Welcome\n initialOpen={!steps.welcome}\n project={project}\n markStepDone={() => setStep('welcome', true)}\n />\n )\n }\n }\n\n if (\n !steps.accepted &&\n project.answer_code === api.ProjectAnswerCode.ACCEPTED &&\n (project.status === api.ProjectStatus.NEW || project.status === api.ProjectStatus.PENDING)\n ) {\n content = async () => {\n return (\n <view.Accepted\n initialOpen={!steps.accepted}\n project={project}\n markStepDone={() => setStep('accepted', true)}\n />\n )\n }\n }\n\n if ((steps.welcome || project.status !== api.ProjectStatus.NEW) && !steps.examples) {\n content = async () => {\n if (!steps.alreadyExamplesOnce) {\n await new Promise((resolve) => setTimeout(resolve, 500))\n setStep('alreadyExamplesOnce', true)\n }\n return <view.Examples initialOpen={true} project={project} markStepDone={() => setStep('examples', true)} />\n }\n }\n\n if (models.project.isAllFieldsetsFilled(project) && project.status === api.ProjectStatus.NEW && !steps.submit) {\n content = async () => {\n return (\n <view.Submit initialOpen={!steps.submit} project={project} markStepDone={() => setStep('submit', true)} />\n )\n }\n }\n\n if (\n !steps.offboardingSuccess &&\n models.project.isOkpalOffboardingAvailable<projectModel.ExtraFields>(project) &&\n offboardingSuccess(steps, project)\n ) {\n content = async () => {\n return (\n <view.OffboardingSuccess\n initialOpen={true}\n project={project}\n markStepSeen={() => setStep('offboardingSuccess', Math.floor(+new Date() / 1000))}\n />\n )\n }\n }\n\n if (\n !steps.offboardingFunded &&\n models.project.isOkpalOffboardingAvailable<projectModel.ExtraFields>(project) &&\n offboardingFunded(steps, project)\n ) {\n content = async () => {\n return (\n <view.OffboardingFunded\n initialOpen={true}\n project={project}\n markStepSeen={() => setStep('offboardingFunded', Math.floor(+new Date() / 1000))}\n />\n )\n }\n }\n }\n\n if (models.project.isComingSoonEnabled(project) && isPreview(location.pathname) && !steps.preview) {\n content = async () => {\n return (\n <view.Preview project={project} markStepSeen={() => setStep('preview', Math.floor(+new Date() / 1000))} />\n )\n }\n }\n\n if (\n models.project.isComingSoonEnabled(project) &&\n location.pathname.includes('/coming-soon/') &&\n !steps.comingsoon\n ) {\n content = async () => {\n return (\n <view.ComingSoon\n project={project}\n markStepSeen={() => setStep('comingsoon', Math.floor(+new Date() / 1000))}\n />\n )\n }\n }\n\n return content()\n }\n\n return (\n <BaseLilSam\n namespace=\"lilsam\"\n project={project as api.Project<'onboarding_steps'>}\n updateSteps={(onboarding_steps) => {\n // @ts-expect-error ExtraFields mismatch\n return dispatch(projectAction.update(project, { onboarding_steps }))\n }}\n rule={{ body: rule, dependencies: [project] }}\n />\n )\n}\n\nfunction offboardingFunded(steps: Record<string, any>, project: projectModel.Project): boolean {\n const date = new Date()\n const currentTimestamp = Math.floor(date.getTime() / 1000)\n const sevenDaysNumeral = 7 * 24 * 60 * 60\n const twentyFourHourNumeral = 24 * 60 * 60\n const littleSamLastDisplayDate = steps.offboardingFunded as number\n const remaingTimeToProjectEndDate =\n project.date_end === undefined ? NaN : Math.floor(+new Date(project.date_end) / 1000) - currentTimestamp\n const postCampaignUrl = project.post_campaign_link?.url\n\n return (\n models.project.funded<projectModel.ExtraFields>(project) &&\n remaingTimeToProjectEndDate < sevenDaysNumeral &&\n !postCampaignUrl &&\n ((!littleSamLastDisplayDate && remaingTimeToProjectEndDate > twentyFourHourNumeral) ||\n currentTimestamp > littleSamLastDisplayDate + twentyFourHourNumeral)\n )\n}\n\nfunction offboardingSuccess(steps: Record<string, any>, project: projectModel.Project): boolean {\n const date = new Date()\n const currentTimestamp = Math.floor(date.getTime() / 1000)\n const sixMonthAgoTimestamp = Math.floor(date.setMonth(date.getMonth() - 6) / 1000)\n const twentyFourHourNumeral = 24 * 60 * 60\n const littleSamLastDisplayDate = steps.offboardingFunded as number\n const projectEndDateTimestamp = project.date_end === undefined ? NaN : Math.floor(+new Date(project.date_end) / 1000)\n const postCampaignUrl = project.post_campaign_link?.url\n\n return (\n models.project.success<projectModel.ExtraFields>(project) &&\n sixMonthAgoTimestamp < projectEndDateTimestamp &&\n !postCampaignUrl &&\n (!littleSamLastDisplayDate || currentTimestamp > littleSamLastDisplayDate + twentyFourHourNumeral)\n )\n}\n", "import * as React from 'react'\nimport styled from 'styled-components'\nimport { BREAKPOINTS } from '@ulule/owl-kit-components/next'\n\nimport { useLilSam, Rule, Project } from './useLilSam'\n\ntype LilSamProps<PROJECT extends Project> = {\n className?: string\n namespace: string\n project: PROJECT\n rule: { body: Rule; dependencies: any[] }\n updateSteps: (onboarding_steps: any) => Promise<any>\n}\n\nconst FixedWrapper = styled.div`\n position: absolute;\n top: 120px;\n left: 10px;\n\n @media screen and ${BREAKPOINTS.TABLET} {\n top: 74px;\n left: 230px;\n }\n`\n\nfunction LilSamComponent<PROJECT extends Project>({\n className,\n namespace,\n project,\n rule,\n updateSteps,\n}: LilSamProps<PROJECT>): React.ReactElement<LilSamProps<PROJECT>> | null {\n const lilSam = useLilSam(namespace, project, rule.body, rule.dependencies, updateSteps)\n\n return <FixedWrapper className={className}>{lilSam}</FixedWrapper>\n}\n\nexport const LilSam = styled(LilSamComponent)``\n", "import * as React from 'react'\n\nimport * as api from '@owl-nest/api-client/latest'\nimport { useAwait, AwaitStatus } from '@owl-nest/hooks'\nimport { useOnboardingStep } from '../Onboarding/useOnboardingStep'\n\nexport type Project = api.Project<'onboarding_steps'>\n\nexport type Rule = (steps: { [s: string]: any }, setStep: SetStep) => Promise<React.ReactNode | undefined>\n\ntype SetStep = (name: string, value: any) => Promise<any>\n\nexport function useLilSam<PROJECT extends Project>(\n namespace: string,\n project: PROJECT,\n rule: Rule,\n dependencies: any[],\n updateSteps: (onboarding_steps: any) => Promise<any>,\n): React.ReactNode {\n const currentSteps = project?.onboarding_steps?.[namespace] || {}\n const setOnboardingStep = useOnboardingStep({ project, namespace, setOnboardingSteps: updateSteps })\n const rulePromise = React.useMemo(() => rule(currentSteps, setOnboardingStep), dependencies)\n const awaited = useAwait(rulePromise)\n\n if (awaited.status === AwaitStatus.SUCCESS) {\n return awaited.success\n }\n\n return undefined\n}\n", "import * as model from '@owl-nest/models'\nimport * as api from '@owl-nest/api-client/latest'\n\ntype OnboardingConfig = {\n project: api.Project\n namespace: string\n setOnboardingSteps: (\n nextSteps: model.project.ProjectForOwner['onboarding_steps'],\n extra?: model.project.UpdateProject,\n ) => Promise<void>\n}\n\n// This is not actually a real hook: it does not use any primitive react hook\n// and does not use custom hooks. But we still use the hook naming scheme\n// because this is a hook in spirit.\n//\n// In a perfect world the `setOnboardingStep` should send a PATCH to the\n// project resource (using the `useProject` hook in the\n// `@owl-nest/service` package, relying on the `useSharedQuery` hook). But we\n// are not in a perfect world, and `useOnboarding` is used in the\n// `project` feature that still uses redux.\n//\n// We could use `useProject` here, but we would get a `project` that is not in\n// sync with redux. We could force redux to be in sync with `useProject` with a\n// `SYNC` action, but we could still fall out of sync if the redux state changes\n// by itself (through an 'old style' action dispatch). This means we would need\n// a two-way sync (redux => atom and atom => redux), and that's\n// always a bad idea and a pain to maintain\n//\n// We could create a hook using the `project` reducer and actions (same as with\n// `useAuth`), that way we only ever update the `atom`, and in return the\n// `atom` updates the redux state (one way sync, yay!), but this means we\n// will have two different ways of handling api requests (old school ad-hoc\n// reducer vs `useSharedQuery`), and two different stores that we still need to\n// sync two-way style.\n//\n// The solution is to extract away state management. The\n// `setOnboardingSteps` passed to the hook uses whatever state management it\n// chooses, and here we do our magic, and call the state management when done.\n//\n// Once redux is removed, it should be possible to transform this \"pseudo-hook\"\n// into a real hook, relying on the one and only `useProject` hook instead.\nexport function useOnboardingStep({\n project,\n namespace,\n setOnboardingSteps,\n}: OnboardingConfig): (name: string, value: any, extra?: model.project.UpdateProject) => Promise<void> {\n const currentSteps = project?.onboarding_steps?.[namespace] || {}\n\n return setOnboardingStep\n\n async function setOnboardingStep(name: string, value: any, extra?: model.project.UpdateProject): Promise<void> {\n if (currentSteps[name] === value) {\n return\n }\n\n const nextSteps = {\n ...(project.onboarding_steps || {}),\n [namespace]: {\n ...(currentSteps || {}),\n [name]: value,\n },\n }\n\n return setOnboardingSteps(nextSteps, extra)\n }\n}\n", "export { Accepted } from './Accepted'\nexport { ComingSoon } from './ComingSoon'\nexport { Examples } from './Examples'\nexport { Message } from './Message'\nexport { OffboardingFunded } from './OffboardingFunded'\nexport { OffboardingSuccess } from './OffboardingSuccess'\nexport { Submit } from './Submit'\nexport { Preview } from './Preview'\nexport { Validated } from './Validated'\nexport { Welcome } from './Welcome'\n", "import * as React from 'react'\nimport styled from 'styled-components'\n\nimport * as model from '@owl-nest/models'\nimport * as layout from '../layout'\nimport { styles as S } from '@ulule/owl-kit-components/next'\nimport { t } from '@owl-nest/localize'\n\nimport * as projectModel from '../../../models/project'\n\nconst Coach = styled(layout.Coach)`\n ${S.modal.Body} {\n display: flex;\n flex-direction: column;\n }\n ${S.button.Button} {\n margin-top: 15px;\n }\n`\n\ntype AcceptedProps = {\n initialOpen: boolean\n project: projectModel.Project\n markStepDone: () => Promise<void>\n}\n\nexport function Accepted({\n project,\n markStepDone,\n initialOpen,\n}: AcceptedProps): React.ReactElement<AcceptedProps> | null {\n const manager = project.manager || project.default_manager\n const [open, setIsOpen] = React.useState(initialOpen)\n\n if (manager === undefined) {\n return null\n }\n\n const managerAvatar = model.image.getUrl(manager.avatar.versions, '128x128')\n\n if (!open) {\n return (\n <layout.Notification avatar={managerAvatar} onClick={goToDiscussion}>\n {t('1 new message')}\n </layout.Notification>\n )\n }\n\n return (\n <Coach closable={true} open={open} title={t('Ready to start?')} onClose={handleDone} avatar={managerAvatar}>\n <S.heading.XS>{t('It\u2019s your move \uD83C\uDF89')}</S.heading.XS>\n <S.copy.S>\n {t('Your project will happen on Ulule! %(manager)s will be your coach and has a message for you.', {\n manager: manager.name,\n })}\n </S.copy.S>\n <S.button.Button kind=\"primary\" onClick={goToDiscussion}>\n {t('Read %(manager)s\u2019s message', {\n manager: manager.name,\n })}\n </S.button.Button>\n </Coach>\n )\n\n async function handleDone(): Promise<void> {\n setIsOpen(false)\n await markStepDone()\n }\n\n async function goToDiscussion(): Promise<void> {\n await handleDone()\n window.location.href = `/projects/${project.id}/discussion/#last-message`\n }\n}\n", "export * from './Coach'\nexport * from './Notification'\nexport * from './SimpleModal'\n", "import * as React from 'react'\nimport styled from 'styled-components'\n\nimport * as plume from '@ulule/owl-kit-components/next'\n\nconst CoachWrapper = styled.div`\n display: flex;\n flex-direction: row;\n align-items: flex-end;\n\n ${plume.styles.image.Avatar} {\n box-shadow: ${plume.EFFECTS.SHADOW_2};\n margin-right: 10px;\n }\n`\n\nconst CoachModal = styled(plume.SmallModal)<{ titleBackgroundColor?: string }>`\n width: 300px;\n box-shadow: ${plume.EFFECTS.SHADOW_2};\n border-radius: 2px 2px 0 0;\n\n ${plume.styles.modal.Body} {\n display: flex;\n flex-direction: column;\n }\n ${plume.styles.modal.Title} {\n border-radius: 2px 2px 0 0;\n }\n ${plume.styles.button.Button} {\n margin-top: 15px;\n }\n ${plume.LinkAsButton} {\n margin: 0 0 -10px;\n width: auto;\n justify-self: center;\n }\n ${plume.styles.heading.XS} {\n margin-bottom: 20px;\n }\n ${plume.styles.copy.S} {\n margin-bottom: 10px;\n }\n\n @media not screen and ${plume.BREAKPOINTS.TABLET} {\n &::before {\n content: '';\n background-color: ${({ titleBackgroundColor }) => titleBackgroundColor ?? plume.COLORS.PRIMARY_BLUE};\n border-radius: 0 0 0 2px;\n clip-path: polygon(0% 0%, 100% 100%, 0% 100%);\n height: 10px;\n left: 27px;\n position: absolute;\n top: -5px;\n transform: rotate(135deg);\n width: 10px;\n }\n }\n\n @media screen and ${plume.BREAKPOINTS.TABLET} {\n &::before {\n content: '';\n background-color: ${({ titleBackgroundColor }) => titleBackgroundColor ?? plume.COLORS.PRIMARY_BLUE};\n border-radius: 0 0 0 2px;\n clip-path: polygon(0% 0%, 100% 100%, 0% 100%);\n height: 10px;\n left: -4px;\n position: absolute;\n top: 17px;\n transform: rotate(45deg);\n width: 10px;\n }\n }\n`\n\ntype CoachProps = {\n avatar?: string\n children: React.ReactNode\n className?: string\n closable: boolean\n onAvatarClick?: () => void\n onClose: () => void\n open: boolean\n title: React.ReactNode\n titleBackgroundColor?: string\n}\n\nfunction CoachComponent({\n children,\n className,\n closable,\n onClose,\n open,\n title,\n titleBackgroundColor,\n}: CoachProps): React.ReactElement<CoachProps> {\n return (\n <CoachWrapper className={className}>\n <CoachModal\n open={open}\n closable={closable}\n onClose={onClose}\n title={title}\n titleBackgroundColor={titleBackgroundColor}\n >\n {children}\n </CoachModal>\n </CoachWrapper>\n )\n}\n\nexport const Coach = styled(CoachComponent)<CoachProps>``\n", "import * as React from 'react'\nimport styled from 'styled-components'\n\nimport * as plume from '@ulule/owl-kit-components/next'\n\nconst NotificationWrapper = styled(plume.styles.copy.S)`\n box-shadow: ${plume.EFFECTS.SHADOW_2};\n border-radius: 2px;\n display: flex;\n flex-direction: row;\n font-weight: 700;\n border: none;\n padding: 11px 15px;\n background: ${plume.COLORS.PRIMARY_BLUE};\n display: flex;\n align-items: center;\n color: ${plume.COLORS.PRIMARY_WHITE};\n cursor: pointer;\n\n ${plume.styles.image.Avatar} {\n margin-right: 10px;\n background: ${plume.COLORS.PRIMARY_WHITE};\n }\n\n @media not screen and ${plume.BREAKPOINTS.TABLET} {\n &::before {\n content: '';\n background-color: ${plume.COLORS.PRIMARY_BLUE};\n border-radius: 0 0 0 2px;\n clip-path: polygon(0% 0%, 100% 100%, 0% 100%);\n height: 10px;\n left: 27px;\n position: absolute;\n top: -5px;\n transform: rotate(135deg);\n width: 10px;\n }\n }\n\n @media screen and ${plume.BREAKPOINTS.TABLET} {\n &::before {\n content: '';\n background-color: ${plume.COLORS.PRIMARY_BLUE};\n border-radius: 0 0 0 2px;\n clip-path: polygon(0% 0%, 100% 100%, 0% 100%);\n height: 10px;\n left: -4px;\n position: absolute;\n transform: rotate(45deg);\n top: 17px;\n width: 10px;\n }\n }\n`\n\ntype NotificationProps = {\n avatar?: string\n children: React.ReactNode\n className?: string\n onClick: () => void\n}\n\nfunction NotificationComponent({\n avatar,\n children,\n className,\n onClick,\n}: NotificationProps): React.ReactElement<NotificationProps> {\n return (\n <NotificationWrapper onClick={onClick} className={className} as=\"button\">\n {children}\n </NotificationWrapper>\n )\n}\n\nexport const Notification = styled(NotificationComponent)<NotificationProps>``\n", "import * as React from 'react'\nimport styled from 'styled-components'\nimport * as plume from '@ulule/owl-kit-components/next'\nconst SimpleModalWrapper = styled.div`\n display: flex;\n flex-direction: row;\n align-items: flex-end;\n`\n\nconst SimpleModalContent = styled(plume.Modal)`\n ${plume.styles.heading.XXS} {\n margin-bottom: 20px;\n }\n`\n\ntype SimpleModalProps = {\n buttons?: plume.ModalButtons\n children: React.ReactNode\n className?: string\n closable: boolean\n onClose: () => void\n open: boolean\n}\n\nfunction SimpleModalComponent({\n buttons,\n children,\n className,\n closable,\n onClose,\n open,\n}: SimpleModalProps): React.ReactElement<SimpleModalProps> {\n return (\n <SimpleModalWrapper className={className}>\n <SimpleModalContent open={open} closable={closable} onClose={onClose} buttons={buttons}>\n {children}\n </SimpleModalContent>\n </SimpleModalWrapper>\n )\n}\n\nexport const SimpleModal = styled(SimpleModalComponent)<SimpleModalProps>``\n", "import * as React from 'react'\nimport * as Redux from 'react-redux'\nimport styled from 'styled-components'\n\nimport * as layout from '../layout'\nimport { Button, LinkAsButton, styles as S } from '@ulule/owl-kit-components/next'\nimport { t } from '@owl-nest/localize'\n\nimport * as projectModel from '../../../models/project'\nimport * as modalActions from '../../../../actions/modal'\n\ntype ComingSoonProps = {\n project: projectModel.Project\n markStepSeen: () => Promise<void>\n}\n\nexport function ComingSoon({ project, markStepSeen }: ComingSoonProps): React.ReactElement<ComingSoonProps> | null {\n const dispatch = Redux.useDispatch()\n const manager = project.manager || project.default_manager\n\n const [open, setIsOpen] = React.useState(true)\n\n if (manager === undefined) {\n return null\n }\n\n return (\n <layout.SimpleModal\n closable={true}\n open={open}\n onClose={handleDone}\n buttons={[\n {\n type: 'button',\n props: {\n onClick: openShareOverlay,\n children: t('Share my page'),\n },\n },\n {\n type: 'linkAsButton',\n props: {\n kind: 'secondary',\n onClick: handleDone,\n children: t('Later'),\n },\n },\n ]}\n >\n <S.heading.XXS>{t('Grow your fans list')}</S.heading.XXS>\n <S.copy.S>\n {t(\n 'Did you know you can share a \u201CComing soon\u201D version of your page where your community can already subscribe and get an email the day you launch!',\n )}\n </S.copy.S>\n </layout.SimpleModal>\n )\n\n function handleDone(): void {\n setIsOpen(false)\n markStepSeen()\n }\n\n function openShareOverlay(): void {\n dispatch(modalActions.toggleShareOverlay(true))\n handleDone()\n }\n}\n\nconst CallToAction = styled(Button)`\n width: 100%;\n`\n", "import * as React from 'react'\nimport * as Redux from 'react-redux'\nimport { Dispatch } from 'redux'\n\nimport * as model from '@owl-nest/models'\nimport * as layout from '../layout'\nimport { LinkAsButton, Button, styles as S } from '@ulule/owl-kit-components/next'\nimport { t } from '@owl-nest/localize'\n\nimport * as projectModel from '../../../models/project'\nimport * as projectAction from '../../../../actions/project'\n\ntype ExamplesProps = {\n initialOpen: boolean\n project: projectModel.Project\n markStepDone: () => Promise<void>\n}\n\nexport function Examples({\n initialOpen,\n project,\n markStepDone,\n}: ExamplesProps): React.ReactElement<ExamplesProps> | null {\n const manager = project.manager || project.default_manager\n const [open, setIsOpen] = React.useState(initialOpen)\n const dispatch = Redux.useDispatch<Dispatch>()\n\n if (manager === undefined) {\n return null\n }\n\n const mainTag = project.main_tag\n const category = mainTag ? model.i18n.get(mainTag.name) : undefined\n\n return (\n <layout.Coach\n closable={true}\n open={open}\n title={t('Need inspiration?')}\n onClose={() => handleDone(true)}\n avatar={model.image.getUrl(manager.avatar.versions, '128x128')}\n >\n <S.copy.S>\n {t(\n 'I found some awesome %(category)s projects that will inspire you and help you build your page! Interested?',\n {\n category,\n },\n )}\n </S.copy.S>\n <Button kind=\"primary\" onClick={goToDiscussion}>\n {t('See examples')}\n </Button>\n <LinkAsButton kind=\"secondary\" onClick={() => handleDone(true)}>\n {t('Later')}\n </LinkAsButton>\n </layout.Coach>\n )\n\n async function handleDone(delay: boolean): Promise<void> {\n setIsOpen(false)\n await markStepDone()\n await computeExample(delay)\n }\n\n async function computeExample(withDelay: boolean): Promise<void> {\n const isProjectOnline = project.is_online\n return dispatch(\n projectAction.computeExamples(project, isProjectOnline ? { force_recompute: true } : { with_delay: withDelay }),\n )\n }\n\n async function goToDiscussion(): Promise<void> {\n await handleDone(false)\n window.location.href = `/projects/${project.id}/discussion/#last-message`\n }\n}\n", "import * as React from 'react'\nimport styled from 'styled-components'\n\nimport * as model from '@owl-nest/models'\nimport * as api from '@owl-nest/api-client/latest'\nimport * as layout from '../layout'\nimport { t } from '@owl-nest/localize'\n\nimport * as projectModel from '../../../models/project'\n\nconst Wrapper = styled(layout.Notification)``\n\ntype MessageProps = {\n project: projectModel.Project\n sender: api.PublicUser\n}\n\nexport function Message({ project, sender }: MessageProps): React.ReactElement<MessageProps> {\n return (\n <Wrapper avatar={model.image.getUrl(sender.avatar.versions, '128x128')} onClick={goToDiscussion}>\n {t('1 new message')}\n </Wrapper>\n )\n\n function goToDiscussion(): void {\n window.location.href = `/projects/${project.id}/discussion/#last-message`\n }\n}\n", "import * as React from 'react'\nimport styled from 'styled-components'\n\nimport * as model from '@owl-nest/models'\nimport * as layout from '../layout'\nimport { Button, LinkAsButton, styles as S, VideoLoader } from '@ulule/owl-kit-components/next'\nimport { t, tc } from '@owl-nest/localize'\n\nimport * as projectModel from '../../../models/project'\n\nconst Coach = styled(layout.Coach)`\n ${VideoLoader} {\n margin: 14px 0;\n }\n ${Button} {\n width: 100%;\n }\n`\n\ntype OffboardingFundedProps = {\n initialOpen: boolean\n project: projectModel.Project\n markStepSeen: () => Promise<void>\n}\n\nexport function OffboardingFunded({\n initialOpen,\n project,\n markStepSeen,\n}: OffboardingFundedProps): React.ReactElement<OffboardingFundedProps> | null {\n const manager = project.manager || project.default_manager\n\n const [open, setIsOpen] = React.useState(initialOpen)\n\n if (manager === undefined) {\n return null\n }\n\n const managerAvatar = model.image.getUrl(manager.avatar.versions, '128x128')\n\n return (\n <Coach closable={true} open={open} title={t('Clock is ticking \u23F0')} onClose={handleDone} avatar={managerAvatar}>\n <S.copy.S>\n {tc(\n `It\u2019s almost over![br][br]Your campaign is ending but your project lives beyond Ulule, give your visitors the chance to continue to follow and support you! \uD83D\uDC47`,\n { br: <br /> },\n )}\n </S.copy.S>\n\n <Button onClick={goToOffboarding}>{t('Prepare your campaign')}</Button>\n\n <LinkAsButton kind=\"secondary\" onClick={handleDone}>\n {t('Later')}\n </LinkAsButton>\n </Coach>\n )\n\n function handleDone(): void {\n setIsOpen(false)\n markStepSeen()\n }\n\n async function goToOffboarding(): Promise<void> {\n await markStepSeen()\n window.location.href = `/projects/${project.id}/backoffice/offboarding/`\n }\n}\n", "import * as React from 'react'\nimport styled from 'styled-components'\n\nimport * as model from '@owl-nest/models'\nimport * as layout from '../layout'\nimport { Button, LinkAsButton, styles as S, VideoLoader } from '@ulule/owl-kit-components/next'\nimport { t, tc } from '@owl-nest/localize'\n\nimport * as projectModel from '../../../models/project'\n\nconst OffboardingFundedWrapper = styled(layout.Coach)`\n ${VideoLoader} {\n margin: 14px 0;\n }\n ${Button} {\n width: 100%;\n }\n`\n\ntype OffboardingFundedProps = {\n initialOpen: boolean\n project: projectModel.Project\n markStepSeen: () => Promise<void>\n}\n\nexport function OffboardingSuccess({\n project,\n markStepSeen,\n initialOpen,\n}: OffboardingFundedProps): React.ReactElement<OffboardingFundedProps> | null {\n const manager = project.manager || project.default_manager\n\n const [open, setIsOpen] = React.useState(initialOpen)\n\n if (manager === undefined) {\n return null\n }\n\n const managerAvatar = model.image.getUrl(manager.avatar.versions, '128x128')\n\n return (\n <OffboardingFundedWrapper\n closable={true}\n open={open}\n title={t('Successfully funded!')}\n onClose={handleDone}\n avatar={managerAvatar}\n >\n <S.copy.S>\n {tc(\n `You\u2019ve got an audience \uD83D\uDC4B [br][br] An audience is still being drawn to your page. Give that latecomers a chance to back or follow your project! Let\u2019s do this together!`,\n {\n br: <br />,\n },\n )}\n </S.copy.S>\n\n <Button onClick={goToOffboarding}>{t('Update your page now')}</Button>\n\n <LinkAsButton kind=\"secondary\" onClick={handleDone}>\n {t('Later')}\n </LinkAsButton>\n </OffboardingFundedWrapper>\n )\n\n function handleDone(): void {\n setIsOpen(false)\n markStepSeen()\n }\n\n async function goToOffboarding(): Promise<void> {\n await markStepSeen()\n window.location.href = `/projects/${project.id}/backoffice/offboarding/`\n }\n}\n", "import * as React from 'react'\nimport * as Redux from 'react-redux'\nimport styled from 'styled-components'\n\nimport * as plume from '@ulule/owl-kit-components/next'\n\nimport * as model from '@owl-nest/models'\nimport * as layout from '../../layout'\nimport { t } from '@owl-nest/localize'\n\nimport * as modalAction from '../../../../../actions/modal'\nimport * as projectModel from '../../../../models/project'\nimport * as projectAction from '../../../../../actions/project'\n\nimport { ProjectSubmissionModal } from '@owl-nest/layout'\n\nconst Wrapper = styled(layout.Coach)`\n ${plume.styles.modal.Wrapper} {\n max-width: 400px;\n }\n\n ${plume.styles.modal.Body} {\n display: flex;\n flex-direction: column;\n justify-content: center;\n }\n`\n\ntype SubmitProps = {\n initialOpen: boolean\n project: projectModel.Project\n markStepDone: () => Promise<void>\n}\n\nexport function Submit({ project, markStepDone, initialOpen }: SubmitProps): React.ReactElement<SubmitProps> | null {\n const dispatch = Redux.useDispatch()\n const manager = project.manager || project.default_manager\n\n const [open, setIsOpen] = React.useState(initialOpen)\n\n if (manager === undefined) {\n return null\n }\n\n const managerAvatar = model.image.getUrl(manager.avatar.versions, '128x128')\n\n React.useEffect(() => {\n dispatch(modalAction.storeSubmitConfirmationHandler(handleClose, handleSubmit))\n }, [])\n\n return (\n <Wrapper\n key={'submit'}\n closable={true}\n open={open}\n title={t('Submit for review')}\n onClose={handleClose}\n avatar={managerAvatar}\n >\n <plume.styles.heading.XS>{t('Congrats \uD83D\uDC4F')}</plume.styles.heading.XS>\n <plume.styles.copy.S>\n {t('Your project page is complete. You can submit it for review by our team.')}\n </plume.styles.copy.S>\n <plume.Button kind=\"primary\" onClick={() => dispatch(modalAction.toggleModalSubmitForReview(true))}>\n {t('Submit for review')}\n </plume.Button>\n <plume.LinkAsButton kind=\"secondary\" onClick={handleClose}>\n {t('Later')}\n </plume.LinkAsButton>\n </Wrapper>\n )\n\n function handleClose(): void {\n setIsOpen(false)\n dispatch(modalAction.toggleModalSubmitForReview(false))\n handleSubmit()\n }\n\n async function handleSubmit(): Promise<void> {\n await markStepDone()\n }\n}\n\ntype SubmitModalProps = {\n open: boolean\n onClose: () => void\n onSubmit: () => void\n project: projectModel.Project\n}\n\nexport function SubmitModal({\n open,\n onClose,\n onSubmit,\n project,\n}: SubmitModalProps): React.ReactElement<SubmitModalProps> {\n const dispatch = Redux.useDispatch()\n\n return (\n <ProjectSubmissionModal\n open={open}\n onSubmit={(values: { message?: string }) => {\n return handleSubmit(values)\n }}\n onClose={onClose}\n onSuccessClose={onClose}\n project={project}\n />\n )\n\n async function handleSubmit(values: { message?: string }): Promise<boolean> {\n // @ts-expect-error ExtraFields mismatch\n const result = await dispatch(projectAction.submit(project, values))\n return result.caseOf({\n right: () => {\n onSubmit()\n return true\n },\n left: () => {\n return false\n },\n })\n }\n}\n", "import * as React from 'react'\nimport * as Redux from 'react-redux'\nimport styled from 'styled-components'\n\nimport * as layout from '../layout'\nimport { Button, LinkAsButton, styles as S } from '@ulule/owl-kit-components/next'\nimport { t } from '@owl-nest/localize'\n\nimport * as projectModel from '../../../models/project'\nimport * as modalActions from '../../../../actions/modal'\n\ntype PreviewProps = {\n project: projectModel.Project\n markStepSeen: () => Promise<void>\n}\n\nexport function Preview({ project, markStepSeen }: PreviewProps): React.ReactElement<PreviewProps> | null {\n const dispatch = Redux.useDispatch()\n const manager = project.manager || project.default_manager\n\n const [open, setIsOpen] = React.useState(true)\n\n if (manager === undefined) {\n return null\n }\n\n return (\n <layout.SimpleModal\n closable={true}\n open={open}\n onClose={handleDone}\n buttons={[\n {\n type: 'button',\n props: {\n onClick: openShareOverlay,\n children: t('See my coming soon page'),\n },\n },\n {\n type: 'linkAsButton',\n props: {\n kind: 'secondary',\n onClick: handleDone,\n children: t('Later'),\n },\n },\n ]}\n >\n <S.copy.S>\n {t(\n 'This preview shows how your page will look exactly to your visitors. You also now have a \u201CComing soon\u201D version of this page to grow your fans list.',\n )}\n </S.copy.S>\n </layout.SimpleModal>\n )\n\n function handleDone(): void {\n setIsOpen(false)\n markStepSeen()\n }\n\n function openShareOverlay(): void {\n dispatch(modalActions.toggleShareOverlay(true))\n handleDone()\n }\n}\n", "import * as React from 'react'\nimport styled from 'styled-components'\n\nimport * as model from '@owl-nest/models'\nimport * as layout from '../layout'\nimport { LinkAsButton, Button, styles as S, COLORS } from '@ulule/owl-kit-components/next'\nimport { t } from '@owl-nest/localize'\n\nimport * as projectModel from '../../../models/project'\n\nconst Coach = styled(layout.Coach)`\n ${S.modal.Title} {\n background-color: ${COLORS.PRIMARY_GREEN};\n }\n ${Button} {\n width: 100%;\n }\n`\n\ntype ValidatedProps = {\n initialOpen: boolean\n project: projectModel.Project\n markStepDone: () => Promise<void>\n}\n\nexport function Validated({\n project,\n initialOpen,\n markStepDone,\n}: ValidatedProps): React.ReactElement<ValidatedProps> | null {\n const manager = project.manager || project.default_manager\n const [open, setIsOpen] = React.useState(initialOpen)\n\n if (manager === undefined) {\n return null\n }\n\n const managerAvatar = model.image.getUrl(manager.avatar.versions, '128x128')\n\n return (\n <Coach\n closable={true}\n open={open}\n title={t('Project verified')}\n onClose={handleDone}\n titleBackgroundColor={COLORS.PRIMARY_GREEN}\n avatar={managerAvatar}\n >\n <S.heading.XS>{t('Great news %(owner)s \uD83D\uDC4F', { owner: model.user.fullName(project.owner) })}</S.heading.XS>\n\n <S.copy.S>\n {t('%(manager)s verified your project, it\u2019s now time to publish it whenever you\u2019re ready!', {\n manager: model.user.fullName(manager),\n })}\n </S.copy.S>\n\n <S.copy.S>{t('Let\u2019s go \uD83D\uDC47')}</S.copy.S>\n\n <Button color=\"green\" onClick={goToPublish}>\n {t('Publish my project')}\n </Button>\n\n <LinkAsButton kind=\"secondary\" onClick={goToDiscussion}>\n {t('Read our advice')}\n </LinkAsButton>\n </Coach>\n )\n\n async function handleDone(): Promise<void> {\n setIsOpen(false)\n markStepDone()\n }\n\n async function goToPublish(): Promise<void> {\n await markStepDone()\n window.location.href = `/projects/${project.id}/backoffice/launch/`\n }\n\n async function goToDiscussion(): Promise<void> {\n await markStepDone()\n window.location.href = `/projects/${project.id}/discussion/#last-message`\n }\n}\n", "import * as React from 'react'\nimport styled from 'styled-components'\n\nimport { styles as S, VideoLoader, LinkAsButton } from '@ulule/owl-kit-components/next'\nimport { t } from '@owl-nest/localize'\nimport * as consent from '@owl-nest/consent'\nimport * as model from '@owl-nest/models'\n\nimport * as layout from '../layout'\n\nimport * as projectModel from '../../../models/project'\nimport * as UFE from '../../../../UFE'\n\nconst VIDEO_ID = 'welcome-video'\n\n// declare that a globale YT variable exists (will be loaded elswhere if needed)\ndeclare const YT: { Player: new (id: string, config: any) => unknown }\n\nconst Coach = styled(layout.Coach)`\n ${VideoLoader} {\n margin: 14px 0;\n }\n`\n\ntype WelcomeProps = {\n initialOpen: boolean\n project: projectModel.Project\n markStepDone: () => Promise<void>\n}\n\nexport function Welcome({ project, markStepDone, initialOpen }: WelcomeProps): React.ReactElement<WelcomeProps> | null {\n const manager = project.manager || project.default_manager\n const video = model.project.isDonationBased(project)\n ? model.i18n.get(UFE.VIDEOS.creatorWelcoming.version.donationBased)\n : model.i18n.get(UFE.VIDEOS.creatorWelcoming.version.rewardBased)\n const videoHtml = `<iframe id=\"${VIDEO_ID}\" allow=\"accelerometer; autoplay; encrypted-media;\" src=\"${video}?enablejsapi=1&showinfo=0&autohide=1&autoplay=1&controls=1&fs=0\" frameBorder=\"0\" allowFullScreen />`\n const videoPlaceholder = model.i18n.get(UFE.VIDEOS.creatorWelcoming.placeholder)\n\n const [open, setIsOpen] = React.useState(initialOpen)\n const playerRef = React.useRef<unknown | null>(null)\n\n if (manager === undefined) {\n return null\n }\n\n return (\n <Coach\n closable={true}\n open={open}\n title={t('Welcome to your page')}\n onClose={handleDone}\n avatar={model.image.getUrl(manager.avatar.versions, '128x128')}\n >\n <S.copy.S>\n {t('To kickstart your project, take a look at this video on how to build a successful project page:')}\n </S.copy.S>\n <div onClick={handleVidoClick}>\n <VideoLoader\n consentWall={consent.media.Wall}\n placeholder={videoPlaceholder?.['1x'] ?? ''}\n srcSet={`${videoPlaceholder?.['2x']} 2x, ${videoPlaceholder?.['3x']} 3x`}\n videoHtml={videoHtml}\n />\n </div>\n <LinkAsButton onClick={handleDone} kind=\"secondary\">\n {t('Later')}\n </LinkAsButton>\n </Coach>\n )\n\n function handleDone(): void {\n setIsOpen(false)\n markStepDone()\n }\n\n function handleVidoClick(): void {\n if (playerRef.current !== null) {\n return\n }\n\n setTimeout(() => {\n playerRef.current = new YT.Player(VIDEO_ID, {\n events: {\n onStateChange: onPlayerStateChange,\n },\n })\n })\n }\n\n function onPlayerStateChange(state: { data: number }): void {\n const hasVideoEnded = state.data === 0\n if (hasVideoEnded) {\n handleDone()\n }\n }\n}\n", "import * as React from 'react'\nimport * as Redux from 'react-redux'\nimport { Dispatch } from 'redux'\n\nimport { renderConfetti } from '@owl-nest/confetti'\nimport * as model from '@owl-nest/models'\n\nimport { useOnboardingStep } from './useOnboardingStep'\nimport * as projectAction from '../../../actions/project'\n\nconst ONBOARDING_NAMESPACE = 'onboarding'\nconst COMMUNITY_NAMESPACE = 'import_community'\n\nexport enum Step {\n WELCOME = 'welcome',\n PROJECT_TYPE = 'project_type',\n IMPORT_TYPE = 'import_type',\n PROFILE = 'profile',\n CATEGORY = 'category',\n TRAINING = 'training',\n REWARD_TYPE = 'reward_type',\n SLUG = 'slug',\n DONE = 'done',\n}\n\nconst STEP_ORDER = [\n Step.WELCOME,\n Step.PROJECT_TYPE,\n Step.IMPORT_TYPE,\n Step.CATEGORY,\n Step.REWARD_TYPE,\n Step.TRAINING,\n Step.PROFILE,\n Step.SLUG,\n]\n\ntype NAMESPACE = typeof ONBOARDING_NAMESPACE | typeof COMMUNITY_NAMESPACE\n\nconst STEP_NAMESPACES: Record<Step, NAMESPACE> = {\n [Step.WELCOME]: ONBOARDING_NAMESPACE,\n [Step.PROJECT_TYPE]: ONBOARDING_NAMESPACE,\n [Step.CATEGORY]: ONBOARDING_NAMESPACE,\n [Step.REWARD_TYPE]: ONBOARDING_NAMESPACE,\n [Step.TRAINING]: ONBOARDING_NAMESPACE,\n [Step.PROFILE]: ONBOARDING_NAMESPACE,\n [Step.SLUG]: ONBOARDING_NAMESPACE,\n [Step.DONE]: ONBOARDING_NAMESPACE,\n [Step.IMPORT_TYPE]: COMMUNITY_NAMESPACE,\n}\n\nlet isGlobalDone = false\n\nexport function getStepIndex(step: Step): string {\n const index = STEP_ORDER.indexOf(step)\n // remove 1 everywhere because `Step.WELCOME` does not count (so there is only 5 steps, CATEGORY being n\u00B0 1)\n return `${index} / ${STEP_ORDER.length - 1}`\n}\n\nexport function getStepProgress(step: Step): number {\n const index = STEP_ORDER.indexOf(step)\n // remove 1 everywhere because `Step.WELCOME` does not count (so there is only 5 steps, CATEGORY being n\u00B0 1)\n return index / (STEP_ORDER.length - 1)\n}\n\nexport function useStep(project: model.project.ProjectForOwner) {\n const dispatch = Redux.useDispatch<Dispatch>()\n const steps = computeSteps(project)\n const step = getCurrentStep()\n const isMembership = model.project.isMembership(project)\n\n const setOnboardingStep = useOnboardingStep({\n project,\n namespace: ONBOARDING_NAMESPACE,\n setOnboardingSteps: (nextSteps, extra) => {\n if (isDone()) {\n return dispatch(projectAction.update(project, { ...extra, onboarding_steps: nextSteps })).then(() => {\n endCallback()\n })\n }\n\n return dispatch(projectAction.update(project, { ...extra, onboarding_steps: nextSteps }))\n },\n })\n const setImportCommunityStep = useOnboardingStep({\n project,\n namespace: COMMUNITY_NAMESPACE,\n setOnboardingSteps: (nextSteps, extra) => {\n return dispatch(projectAction.update(project, { ...extra, onboarding_steps: nextSteps }))\n },\n })\n\n React.useEffect(() => {\n // Inject or subtract slug/title step based on project type\n if (STEP_ORDER.includes(Step.SLUG) && isMembership) {\n STEP_ORDER.pop()\n } else if (!STEP_ORDER.includes(Step.SLUG) && !isMembership) {\n STEP_ORDER.push(Step.SLUG)\n }\n\n // All computed steps where done\n if (step === undefined && !isDone()) {\n isGlobalDone = true\n setOnboardingStep(Step.DONE, true)\n }\n }, [step])\n\n return { step, isDone: isDone(), setStepValue }\n\n function endCallback() {\n if (model.project.isMembership(project)) {\n window.location.href = `/${project.slug}/?confetti=true`\n } else {\n renderConfetti()\n }\n }\n\n async function setStepValue(extra?: model.project.UpdateProject, value: any = true): Promise<void> {\n const step = getCurrentStep()\n if (step === undefined) {\n return\n }\n\n if (step.namespace === 'onboarding') {\n await setOnboardingStep(step.key, value, extra)\n } else {\n await setImportCommunityStep(step.key, value, extra)\n }\n }\n\n function isDone(): boolean {\n return (isGlobalDone || project.onboarding_steps?.[ONBOARDING_NAMESPACE]?.[Step.DONE]) ?? false\n }\n\n function getCurrentStep(): { key: Step; namespace: NAMESPACE } | undefined {\n const markedSteps = {\n ...(project.onboarding_steps?.[ONBOARDING_NAMESPACE] ?? {}),\n ...(project.onboarding_steps?.[COMMUNITY_NAMESPACE] ?? {}),\n }\n\n const lastStepIndex = (Object.keys(markedSteps) as Step[]).reduce((lastStepIndex, step) => {\n const stepIndex = steps.indexOf(step)\n if (stepIndex > lastStepIndex) {\n return stepIndex\n }\n return lastStepIndex\n }, -1)\n\n const currentStepKey = steps[lastStepIndex + 1]\n\n if (currentStepKey === undefined) {\n return undefined\n }\n\n return { key: currentStepKey, namespace: STEP_NAMESPACES[currentStepKey] }\n }\n}\n\nfunction computeSteps(project: model.project.ProjectForOwner): Step[] {\n const steps = [...STEP_ORDER]\n\n // If project already has a main tag, we skip the category step\n if (project.main_tag !== undefined) {\n const index = steps.indexOf(Step.CATEGORY)\n steps.splice(index, 1)\n }\n\n // If project already as a presale type or a goal, we skip the project type step\n if (project.type === 'presale' || project.goal > 0) {\n const index = steps.indexOf(Step.PROJECT_TYPE)\n steps.splice(index, 1)\n }\n\n // If project already as a donation/presale/membership type, or a goal, we skip the reward step\n if (['donation', 'membership', 'presale'].includes(project.type) || project.goal > 0) {\n const index = steps.indexOf(Step.REWARD_TYPE)\n steps.splice(index, 1)\n }\n\n // If project is not a membership or project has 0 community_members_count, we skip the project community step\n if (project.type !== 'membership' || project.community_members_count === 0) {\n const index = steps.indexOf(Step.IMPORT_TYPE)\n steps.splice(index, 1)\n }\n\n // If project is not french, we skip the training step\n if (project.lang !== 'fr') {\n const index = steps.indexOf(Step.TRAINING)\n steps.splice(index, 1)\n }\n\n // If project owner already has an avatar and screenname, we skip the profile step\n if (project.owner.has_avatar && project.owner.screenname) {\n const index = steps.indexOf(Step.PROFILE)\n steps.splice(index, 1)\n }\n\n return steps\n}\n", "import * as React from 'react'\nimport * as Redux from 'react-redux'\nimport * as jotai from 'jotai'\n\n// @ts-ignore\nimport { useMediaQuery } from 'react-responsive'\nimport styled, { css } from 'styled-components'\n\nimport * as api from '@owl-nest/api-client/latest'\nimport * as hooks from '@owl-nest/hooks'\nimport * as models from '@owl-nest/models'\nimport { t } from '@owl-nest/localize'\nimport * as money from '@owl-nest/money'\nimport * as plume from '@ulule/owl-kit-components/next'\nimport { PM_MENU_WIDTH } from '@owl-nest/project-manager-nav'\nimport { CATEGORY, EVENT_TYPE, useTracking } from '@owl-nest/shadow'\nimport { styles } from '@owl-nest/utils'\nimport * as env from '@owl-nest/config'\n\nimport * as projectModel from '../../../../models/project'\nimport { RootState } from '../../../../../reducers'\nimport * as URLs from '../../../../utils/URLs'\nimport * as modalAction from '../../../../../actions/modal'\n\nimport { CreateButton } from '../CreateButton'\nimport { DonationBlock } from '../DonationBlock'\nimport { Heading } from './Heading'\nimport { LiveEvents } from './LiveEvents'\nimport { AdviceModal } from '../AdviceModal'\nimport { Owner } from './Owner'\nimport { PartnerRibbon } from './PartnerRibbon'\nimport { PrimaryMedia } from './PrimaryMedia'\nimport { Statistics } from './Statistics'\nimport { SocialActions } from './SocialActions'\nimport { Sponsors } from './Sponsors'\nimport { TRACKING_ACTION, TRACKING_SOURCE } from '../../utils/trackerEnums'\nimport { DisplayMode } from '../../../../context'\nimport { BackersBlock, BlockStatus, useBlockStatus } from '../BackersBlock'\nimport { useLiveEventsSocket } from './hooks'\nimport { MIDDLE_TABLET_LAPTOP_BREAKPOINT, EDIT_MODE_SMALL_LAPTOP, EDIT_MODE_TABLET_BREAKPOINT } from '../../constants'\n\nexport function HeroHeader(): React.ReactElement<unknown> {\n const dispatch = Redux.useDispatch()\n const project = Redux.useSelector<RootState, projectModel.Project>((state) => state.application.project.data)\n const displayMode = React.useContext(DisplayMode)\n const isEditMode = displayMode === 'edit'\n const userConfig = env.useUserEnv()\n\n const { liveEventsSocketReturn } = useLiveEventsSocket()\n const tracker = useTracking()\n\n const isDesktopOrLaptop = useMediaQuery({\n query: isEditMode ? plume.BREAKPOINTS.LAPTOP : MIDDLE_TABLET_LAPTOP_BREAKPOINT,\n })\n const [isAdviceModalOpen, setAdviceModalOpen] = React.useState(false)\n const [isSecurePaymentModalOpen, setSecurePaymentModalOpen] = React.useState(false)\n\n const backgroundColor = models.project.backgroundColor<projectModel.ExtraFields>(project)\n const backgroundImage = models.project.backgroundImage<projectModel.ExtraFields>(project)\n const hasBackgroundOrImage =\n (backgroundColor !== undefined && plume.COLORS.hexToRgb(backgroundColor, 0) !== 'rgb(255,255,255)') ||\n backgroundImage !== undefined\n\n const isDonationBased = models.project.isDonationBased(project)\n const isFinished = models.project.isFinished<projectModel.ExtraFields>(project)\n\n const setIsTaxDeductionModalOpen = hooks.useSetModal('DonationTaxDeductionInfo')\n const backersBlockStatus = useBlockStatus()\n\n const isUserSupporter = Number(project.user_orders?.length) > 0\n const isBackerBlockDisplayed =\n backersBlockStatus === BlockStatus.CANCELLED ||\n backersBlockStatus === BlockStatus.FINISHED_DONATION_BASED ||\n backersBlockStatus === BlockStatus.SUCCESS_ACTIVE_ONBOARDING ||\n backersBlockStatus === BlockStatus.SUCCESS_INACTIVE_ONBOARDING ||\n (isUserSupporter &&\n (backersBlockStatus === BlockStatus.FINISHED_UNSUCCESSFULLY || backersBlockStatus === BlockStatus.ONLINE))\n\n const isSponsorsDisplayed = Boolean(project.sponsorships)\n\n const isLiveEventsDisplayed = models.project.isOnline(project) && Boolean(liveEventsSocketReturn.events?.events)\n\n return (\n <Wrapper\n backgroundColor={backgroundColor}\n backgroundImage={backgroundImage}\n isEditMode={isEditMode}\n isSponsorsDisplayed={isSponsorsDisplayed}\n isLiveEventsDisplayed={isLiveEventsDisplayed}\n >\n {backersBlockStatus !== BlockStatus.NONE && <BackersBlock status={backersBlockStatus} />}\n\n {!isDesktopOrLaptop && <PrimaryMedia />}\n {!hasBackgroundOrImage && <PartnerRibbon />}\n\n <Content backerBlockIsActive={isBackerBlockDisplayed} isEditMode={isEditMode}>\n <Heading>{hasBackgroundOrImage && <PartnerRibbon />}</Heading>\n\n <Information isEditMode={isEditMode}>\n <InformationTorso isEditMode={isEditMode}>\n {isDesktopOrLaptop && <PrimaryMedia />}\n {isEditMode && project.goal === 0 && !isDonationBased ? (\n <ActionsAndStatisticsEdit isEditMode={isEditMode} withCTA={!isFinished}>\n <CreateButton\n center={true}\n createHandler={() => {\n document.location.href = `/projects/${project.id}/edit/?goal`\n }}\n cta={\n <plume.styles.copy.S>\n <plume.Link\n onClick={() => {\n if (userConfig.lang === 'fr') {\n setAdviceModalOpen(true)\n } else {\n document.location.href = getAdviceURL(userConfig.lang)\n }\n }}\n tinted\n withIcon\n >\n <plume.glyphs.stroke.Bulb size={15} />\n {t('How to set your goal')}\n </plume.Link>\n </plume.styles.copy.S>\n }\n title={\n <CreateButtonTitle>\n <plume.styles.heading.M>{t('Set your goal')}</plume.styles.heading.M>\n <plume.styles.heading.L>{t('Set your goal')}</plume.styles.heading.L>\n </CreateButtonTitle>\n }\n />\n </ActionsAndStatisticsEdit>\n ) : (\n <ActionsAndStatistics isEditMode={isEditMode} withCTA={!isFinished}>\n <Statistics />\n\n <CenteredOnMobile pullContent={isFinished && !project.goal_raised} isEditMode={isEditMode}>\n {!isFinished ? (\n isDonationBased ? (\n <DonationBlock context=\"project-header\" project={project} withFromMention />\n ) : (\n <>\n <ContributionCTAWrapper>\n <plume.styles.button.CallToAction\n disabled={!models.project.isOnline(project)}\n onClick={goToCheckout}\n size=\"medium\"\n >\n <span>{t('Back this project')}</span>\n {project.user_role === api.UserRole.Supporter ? (\n <small>{t('How generous!')}</small>\n ) : (\n !isDonationBased && (\n <small>\n {t('Starting at ')}\n <money.MoneyDisplayer\n amount={project.lowest_contribution_amount || 0}\n project={project}\n />\n </small>\n )\n )}\n </plume.styles.button.CallToAction>\n {!isDonationBased && project.tax_deductible && (\n <TaxInfo\n tinted\n type=\"button\"\n withIcon\n onClick={() => {\n setIsTaxDeductionModalOpen(true)\n }}\n >\n <plume.glyphs.stroke.Percent size={18} />\n {t('This donation is tax-deductible!')}\n </TaxInfo>\n )}\n {!isDonationBased && (\n <plume.LinkAsButton\n kind=\"secondary\"\n onClick={() => {\n setSecurePaymentModalOpen(true)\n }}\n underlined\n >\n {t('Secure and flexible payment')}\n </plume.LinkAsButton>\n )}\n </ContributionCTAWrapper>\n </>\n )\n ) : isDonationBased ? (\n <InvitationToFollowEndedProject>\n {project.goal_status === api.GoalStatus.SUCCESS\n ? t('This fundraiser is now over. To stay up to date, follow it here:')\n : project.goal_status === api.GoalStatus.FAILED\n ? t('This fundraiser has not been funded. To stay up to date, follow it here:')\n : t('This fundraiser was cancelled. To stay up to date, follow it here:')}\n <SocialActions />\n </InvitationToFollowEndedProject>\n ) : !project.goal_raised ? (\n <InvitationToFollowEndedProject>\n {t('This project has not been funded. To stay up to date, follow it here:')}\n <SocialActions />\n </InvitationToFollowEndedProject>\n ) : (\n <InvitationToDiscoverOtherProjects>\n {t('Missed the campaign? Discover more %(mainTag)s live projects \uD83D\uDC47', {\n mainTag: models.project.mainTag<projectModel.ExtraFields>(project),\n })}\n <plume.styles.button.CallToAction kind=\"secondary\" onClick={goToMainCategory} size=\"small\">\n {t('All online projects')}\n </plume.styles.button.CallToAction>\n </InvitationToDiscoverOtherProjects>\n )}\n </CenteredOnMobile>\n </ActionsAndStatistics>\n )}\n </InformationTorso>\n\n <InformationFooter isEditMode={isEditMode}>\n <Owner />\n {(!isFinished || project.goal_raised) && <SocialActions />}\n </InformationFooter>\n </Information>\n </Content>\n <SponsorsAndEventsContainer isEditMode={isEditMode}>\n {isSponsorsDisplayed && <Sponsors />}\n {isLiveEventsDisplayed && <LiveEvents socket={liveEventsSocketReturn} />}\n </SponsorsAndEventsContainer>\n\n <AdviceModal\n link={`/projects/${project.id}/edit/`}\n open={isAdviceModalOpen}\n setOpen={setAdviceModalOpen}\n title={t('How to set your goal')}\n videoHtml='<iframe allow=\"accelerometer; autoplay; encrypted-media;\" allowFullScreen frameBorder=\"0\" src=\"https://www.youtube.com/embed/WowF92vN55w?autoplay=1\" title=\"video-placeholder\" />'\n />\n\n <money.SecurePaymentModal\n open={isSecurePaymentModalOpen}\n projectIsDonationBased={isDonationBased}\n setOpen={setSecurePaymentModalOpen}\n />\n </Wrapper>\n )\n\n function goToMainCategory(): void {\n document.location.href = project.main_tag?.absolute_url ?? ''\n }\n\n function goToCheckout(): void {\n if (!models.project.isOrdersEnabled<projectModel.ExtraFields>(project)) {\n dispatch(modalAction.toggleModalPaymentDisturbance(true))\n } else {\n tracker.track({\n event: EVENT_TYPE.GENERIC,\n eventCategory: CATEGORY.PROJECT_PAGE,\n eventAction: TRACKING_ACTION.ACCESS_CHECKOUT,\n eventLabel: TRACKING_SOURCE.HERO,\n eventCallback: () => {\n document.location.href = URLs.getCheckoutURL(project.id)\n },\n })\n }\n }\n}\n\nfunction getAdviceURL(lang: api.Lang): string {\n let url\n switch (lang) {\n case 'en':\n url = 'https://support.ulule.com/hc/en-us/articles/360001845637-How-to-define-your-goal-'\n break\n\n case 'es':\n url =\n 'https://community.ulule.com/topics/dividir-una-campana-en-tramos-recauda-mas-con-un-objetivo-menor-stretchgoals-14191/'\n break\n\n case 'it':\n url =\n 'https://community.ulule.com/topics/le-campagne-di-crowdfunding-e-il-loro-obiettivo-finanziario-come-calcolarlo-e-quando-perche-applicare-la-strategia-dello-step-by-step-13945/'\n break\n\n case 'nl':\n url = 'https://support.ulule.com/hc/nl/articles/360001845637-Hoe-je-doel-bepalen'\n break\n\n default:\n url = 'https://support.ulule.com/hc/en-us/articles/360001845637-How-to-define-your-goal-'\n break\n }\n\n return url\n}\n\nconst ActionsAndStatistics = styled.div<{ withCTA: boolean; isEditMode: boolean }>`\n margin: 0 15px;\n\n @media screen and ${({ isEditMode }) => (isEditMode ? plume.BREAKPOINTS.LAPTOP : MIDDLE_TABLET_LAPTOP_BREAKPOINT)} {\n display: flex;\n flex-direction: column;\n margin: 0;\n max-width: 420px;\n min-width: 340px;\n width: ${({ isEditMode }) => (isEditMode ? '38%' : '35%')};\n\n ${({ isEditMode }) => {\n if (isEditMode) {\n return css`\n right: 0;\n `\n }\n }}\n\n ${({ isEditMode, withCTA }) => {\n if (withCTA && !isEditMode) {\n return css`\n right: 0;\n `\n }\n }}\n }\n\n @media screen and ${({ isEditMode }) => isEditMode && EDIT_MODE_SMALL_LAPTOP} {\n min-width: 356px;\n width: 45%;\n }\n\n @media screen and ${plume.BREAKPOINTS.LAPTOP_L} {\n margin: 0;\n }\n`\n\nconst ActionsAndStatisticsEdit = styled(ActionsAndStatistics)`\n align-items: center;\n display: flex;\n flex-direction: column;\n justify-content: center;\n\n ${plume.styles.heading.M} {\n display: none;\n }\n\n ${plume.styles.heading.L} {\n display: block;\n }\n\n @media screen and ${({ isEditMode }) =>\n isEditMode ? plume.BREAKPOINTS.LAPTOP : MIDDLE_TABLET_LAPTOP_BREAKPOINT} and (max-width: 1100px) {\n ${plume.styles.heading.M} {\n display: block;\n }\n\n ${plume.styles.heading.L} {\n display: none;\n }\n }\n`\n\nconst CenteredOnMobile = styled.div<{ pullContent?: boolean; isEditMode: boolean }>`\n @media not screen and ${({ isEditMode }) =>\n isEditMode ? plume.BREAKPOINTS.LAPTOP : MIDDLE_TABLET_LAPTOP_BREAKPOINT} {\n display: flex;\n flex-direction: column;\n margin: 0 auto;\n max-width: 500px;\n }\n\n ${({ pullContent = false, isEditMode }) => {\n if (pullContent)\n return css`\n @media screen and (max-width: 1250px) {\n margin-bottom: -46px;\n }\n\n @media not screen and ${isEditMode ? plume.BREAKPOINTS.LAPTOP : MIDDLE_TABLET_LAPTOP_BREAKPOINT} {\n margin-bottom: 0;\n }\n `\n }}\n`\n\nconst Content = styled.div<{ backerBlockIsActive: boolean; isEditMode: boolean }>`\n border-radius: 4px;\n box-shadow: ${plume.EFFECTS.SHADOW_4};\n background-color: ${plume.COLORS.PRIMARY_WHITE};\n\n @media screen and ${({ isEditMode }) => (isEditMode ? plume.BREAKPOINTS.LAPTOP_L : MIDDLE_TABLET_LAPTOP_BREAKPOINT)} {\n margin: 0 auto;\n max-width: 1200px;\n position: relative;\n top: 26px;\n margin-top: 44px;\n width: 100%;\n z-index: 1;\n\n ${({ backerBlockIsActive }) => {\n if (backerBlockIsActive) {\n return css`\n margin-top: 0;\n `\n }\n }}\n }\n`\n\nconst ContributionCTAWrapper = styled.div`\n display: flex;\n flex-direction: column;\n\n ${plume.styles.button.CallToAction} {\n display: inline-flex;\n flex-direction: column;\n height: 80px;\n line-height: 18px;\n }\n\n small {\n font-size: ${styles.rem('15px')};\n font-weight: normal;\n margin-top: 4px;\n text-transform: none;\n }\n`\n\nconst Information = styled.div<{ isEditMode: boolean }>`\n@media screen and ${({ isEditMode }) => (isEditMode ? plume.BREAKPOINTS.LAPTOP : MIDDLE_TABLET_LAPTOP_BREAKPOINT)} {\n margin: 0px ${({ isEditMode }) => (isEditMode ? '20px' : '40px')};\n padding: 0;\n }\n}\n\n@media screen and ${plume.BREAKPOINTS.LAPTOP_L} {\n margin: 0 40px;\n}\n`\n\nconst InformationFooter = styled.div<{ isEditMode: boolean }>`\n display: flex;\n flex-direction: column-reverse;\n margin-left: 15px;\n margin-right: 15px;\n padding-top: 15px;\n padding-bottom: 25px;\n\n @media screen and ${plume.BREAKPOINTS.TABLET} {\n max-width: 100%;\n justify-content: space-between;\n flex-direction: row;\n }\n\n @media screen and ${({ isEditMode }) => (isEditMode ? plume.BREAKPOINTS.LAPTOP : MIDDLE_TABLET_LAPTOP_BREAKPOINT)} {\n margin-left: 0px;\n margin-right: 0px;\n }\n`\n\nconst InformationTorso = styled.div<{ isEditMode: boolean }>`\n position: relative;\n max-height: none;\n\n @media screen and ${({ isEditMode }) => (isEditMode ? plume.BREAKPOINTS.LAPTOP : MIDDLE_TABLET_LAPTOP_BREAKPOINT)} {\n align-items: center;\n display: flex;\n justify-content: space-between;\n max-height: 380px;\n max-width: 1200px;\n }\n\n @media screen and ${plume.BREAKPOINTS.LAPTOP_L} {\n max-height: 380px;\n max-width: 100%;\n }\n`\n\nconst InvitationToFollowEndedProject = styled(plume.styles.heading.XXXS)`\n border: 1px solid ${plume.COLORS.GREY_SHADE_5};\n border-radius: 4px;\n padding: 26px 26px 18px;\n\n div {\n margin-top: 10px;\n }\n`\n\nconst InvitationToDiscoverOtherProjects = styled(plume.styles.copy.S)`\n ${plume.styles.button.CallToAction} {\n margin-top: 20px;\n }\n`\n\ntype WrapperProps = {\n backgroundColor?: string\n backgroundImage?: string\n isEditMode: boolean\n isSponsorsDisplayed: boolean\n isLiveEventsDisplayed: boolean\n}\n\nconst Wrapper = styled.div<WrapperProps>`\n position: relative;\n\n ${({ isEditMode }) =>\n isEditMode &&\n css`\n @media screen and ${EDIT_MODE_TABLET_BREAKPOINT} {\n border-left: 1px solid ${plume.COLORS.PRIMARY_SAND};\n margin-left: ${PM_MENU_WIDTH};\n z-index: 2;\n }\n `};\n\n @media screen and ${({ isEditMode }) =>\n isEditMode ? EDIT_MODE_TABLET_BREAKPOINT : MIDDLE_TABLET_LAPTOP_BREAKPOINT} {\n padding-bottom: 45px;\n padding-top: 20px;\n\n &::after {\n content: '';\n ${({ backgroundColor }) => {\n if (backgroundColor) {\n return css`\n background-color: ${backgroundColor};\n `\n }\n }}\n ${({ backgroundImage }) => {\n if (backgroundImage) {\n return css`\n background-image: url('${backgroundImage}');\n `\n }\n }}\n background-repeat: no-repeat;\n background-position: center;\n background-size: cover;\n ${({ isSponsorsDisplayed, isLiveEventsDisplayed }) => {\n let distance = 130\n\n if (isSponsorsDisplayed) {\n distance += 60\n } else if (isLiveEventsDisplayed) {\n distance += 53\n }\n\n return css`\n height: calc(100% - ${distance}px);\n `\n }}\n left: 0;\n position: absolute;\n top: 0;\n width: 100%;\n z-index: -1;\n }\n }\n`\n\nconst CreateButtonTitle = styled.span`\n margin-bottom: 4px;\n`\n\nconst SponsorsAndEventsContainer = styled.div<{ isEditMode: boolean }>`\n position: relative;\n top: -15px;\n background-color: ${plume.COLORS.PRIMARY_WHITE};\n display: flex;\n justify-content: space-between;\n padding: 15px;\n flex-direction: column;\n max-width: 1200px;\n\n &:empty {\n display: none;\n }\n\n @media not screen and ${({ isEditMode }) =>\n isEditMode ? plume.BREAKPOINTS.LAPTOP : MIDDLE_TABLET_LAPTOP_BREAKPOINT} {\n & > div + div {\n margin-top: 20px;\n }\n }\n\n @media screen and ${plume.BREAKPOINTS.TABLET} {\n align-items: center;\n\n & > div {\n &:only-child {\n margin: 0 auto;\n }\n }\n }\n\n @media screen and ${({ isEditMode }) => (isEditMode ? plume.BREAKPOINTS.LAPTOP_L : MIDDLE_TABLET_LAPTOP_BREAKPOINT)} {\n border-radius: 0px 0px 4px 4px;\n box-shadow: ${plume.EFFECTS.SHADOW_4};\n flex-direction: row;\n top: 23px;\n padding-left: 0px;\n padding-right: 0px;\n margin: 0 auto;\n\n & > div {\n margin-left: 40px;\n margin-right: 40px;\n }\n }\n`\n\nconst TaxInfo = styled(plume.LinkAsButton)`\n margin: 12px auto 0 auto;\n text-align: center;\n width: fit-content;\n padding: 0px;\n flex: 0 0 100%;\n\n ${plume.glyphs.stroke.Percent} {\n color: ${plume.COLORS.GREY_SHADE_7};\n margin-right: 6px;\n margin-top: -1px;\n }\n`\n", "import * as React from 'react'\nimport styled from 'styled-components'\nimport * as Redux from 'react-redux'\n\nimport type * as api from '@owl-nest/api-client/latest'\nimport { t } from '@owl-nest/localize'\nimport * as models from '@owl-nest/models'\nimport { InputWrapper, Tip, TipContainerWrapper } from '@owl-nest/tip'\nimport * as plume from '@ulule/owl-kit-components/next'\nimport * as shadow from '@owl-nest/shadow'\n\nimport * as modalAction from '../../../../actions/modal'\nimport * as URLs from '../../../utils/URLs'\n\ntype DonationBlockProps = {\n context?: string\n project: api.Project\n withFromMention?: boolean\n}\n\nexport function DonationBlock({ context, project, withFromMention = false }: DonationBlockProps): React.ReactElement {\n const isDonationBasedProject = models.project.isDonationBased(project)\n const allowedFrequency = models.project.allowedDonationFrequency(project)\n\n const dispatch = Redux.useDispatch()\n const tracking = shadow.useTracking()\n\n return (\n <TipWrapper className=\"tip-view-tip-component\">\n <plume.styles.heading.XS\n className={isDonationBasedProject && allowedFrequency === 'all' ? 'tip-title-tip-component' : undefined}\n >\n {t('Donate')}\n </plume.styles.heading.XS>\n <StyledTip\n allowNullValue\n context={context}\n disableCta={!models.project.isOnline(project)}\n handleFormSubmit={(values) => {\n if (!models.project.isOrdersEnabled(project)) {\n dispatch(modalAction.toggleModalPaymentDisturbance(true))\n } else {\n tracking.ecommerce.track('add_to_cart', {\n currency: project.currency,\n value: values.donation,\n items: [\n {\n item_id: 'tip',\n item_name: 'tip',\n item_brand: models.project.name(project),\n price: values.donation,\n quantity: 1,\n },\n ],\n })\n\n window.location.href = URLs.getCheckoutURL(project.id, {\n donationFrequency: values.frequency,\n tipAmount: values.donation,\n })\n }\n }}\n project={project}\n translations={{\n placeholder: isDonationBasedProject ? '' : t('5, 10, 25, 50, whatever you want!'),\n submit: t('Donate'),\n }}\n withPresets={isDonationBasedProject}\n withFromMention={withFromMention}\n />\n </TipWrapper>\n )\n}\n\nconst StyledTip = styled(Tip)`\n justify-content: flex-start;\n padding: 0 0 20px 0;\n\n ${InputWrapper} {\n margin-right: 0;\n }\n\n ${plume.Button} {\n width: 100%;\n max-width: 100%;\n min-width: 100%;\n }\n\n ${TipContainerWrapper} {\n flex-wrap: wrap;\n margin-top: 20px;\n }\n`\n\nconst TipWrapper = styled.div`\n border: 1px solid ${plume.COLORS.GREY_SHADE_5};\n padding-top: 15px;\n /* We want those elements to be 90% of container width. This means padding\n of 5% of container width so those paddings are (5/90)*100 % of element\n width */\n padding-left: ${(5 / 90) * 100}%;\n padding-right: ${(5 / 90) * 100}%;\n margin-top: -1px;\n\n ${plume.styles.heading.S} {\n margin-bottom: 5px;\n }\n\n ${plume.styles.copy.M} {\n color: ${plume.COLORS.GREY_SHADE_2};\n margin-bottom: 13px;\n }\n`\n", "import * as React from 'react'\nimport * as Redux from 'react-redux'\nimport styled, { css } from 'styled-components'\n\nimport { t } from '@owl-nest/localize'\nimport * as model from '@owl-nest/models'\nimport { BREAKPOINTS, glyphs, Link, styles as S } from '@ulule/owl-kit-components/next'\nimport * as env from '@owl-nest/config'\nimport * as api from '@owl-nest/api-client/next'\n\nimport { DisplayMode } from '../../../../context'\nimport * as projectModel from '../../../../models/project'\nimport { RootState } from '../../../../../reducers'\nimport { CreateButton } from '../CreateButton'\nimport { EditButton } from '../EditButton'\nimport { MIDDLE_TABLET_LAPTOP_BREAKPOINT } from '../../constants'\n\ntype HeadingProps = {\n children: React.ReactNode\n}\n\nexport function Heading({ children }: HeadingProps): React.ReactElement<HeadingProps> {\n const project = Redux.useSelector<RootState, projectModel.Project>((state) => state.application.project.data)\n const isEditMode = React.useContext(DisplayMode) === 'edit' && !model.project.refused(project)\n const userConfig = env.useUserEnv()\n\n const titleAndSubtitle = (\n <>\n <Title isEditMode={isEditMode}>\n <S.heading.L as=\"h1\">{model.project.name<projectModel.ExtraFields>(project)}</S.heading.L>\n <S.heading.XL as=\"h1\">{model.project.name<projectModel.ExtraFields>(project)}</S.heading.XL>\n </Title>\n <S.copy.M>{model.project.subtitle<projectModel.ExtraFields>(project)}</S.copy.M>\n </>\n )\n\n const editView = (\n <>\n {model.project.name<projectModel.ExtraFields>(project) ? (\n <>\n {titleAndSubtitle}\n <EditButtonWrapper isEditMode={isEditMode}>\n <EditButton link={`/projects/${project.id}/edit/layout/${userConfig.lang}/?name`} />\n </EditButtonWrapper>\n </>\n ) : (\n <EditViewStyled isEditMode={isEditMode}>\n <CreateButton\n center={true}\n createHandler={() => {\n document.location.href = `/projects/${project.id}/edit/layout/${userConfig.lang}/?name`\n }}\n cta={\n <AdviceLinkWrapper>\n <Link\n onClick={() => {\n document.location.href = getAdviceURL(userConfig.lang)\n }}\n tinted\n withIcon\n >\n <glyphs.stroke.Bulb size={15} />\n {t('How to write a good title and subtitle')}\n </Link>\n </AdviceLinkWrapper>\n }\n title={\n <>\n <S.heading.M>{t('Add a title and subtitle')}</S.heading.M>\n <S.heading.L>{t('Add a title and subtitle')}</S.heading.L>\n </>\n }\n />\n </EditViewStyled>\n )}\n </>\n )\n\n return (\n <HeadingWrapper isEditMode={isEditMode}>\n <Content isEditMode={isEditMode}>{isEditMode ? <>{editView}</> : <>{titleAndSubtitle}</>}</Content>\n {children}\n </HeadingWrapper>\n )\n}\n\nfunction getAdviceURL(lang: api.Lang): string {\n let url\n switch (lang) {\n case 'en':\n url = 'https://community.ulule.com/topics/a-title-with-a-hook-17512/#main-31973'\n break\n\n case 'es':\n url = 'https://community.ulule.com/topics/titulo-y-subtitulo-del-proyecto-17522/#main-31991'\n break\n\n case 'fr':\n url = 'https://community.ulule.com/topics/un-titre-accrocheur-17509/#main-31967'\n break\n\n case 'it':\n url = 'https://community.ulule.com/topics/creare-titolo-sottotitolo-campagna-crowdfunding-17517/'\n break\n\n case 'nl':\n url = 'https://community.ulule.com/topics/een-titel-met-een-hoek-af-17514/#main-31975'\n break\n\n default:\n url = 'https://community.ulule.com/topics/a-title-with-a-hook-17512/#main-31973'\n break\n }\n\n return url\n}\n\nconst Title = styled.span<{ isEditMode: boolean }>`\n display: block;\n letter-spacing: 0;\n margin-bottom: 15px;\n\n @media screen and ${({ isEditMode }) => (isEditMode ? BREAKPOINTS.LAPTOP : MIDDLE_TABLET_LAPTOP_BREAKPOINT)} {\n margin-bottom: 8px;\n }\n\n ${S.heading.XL} {\n display: none;\n }\n ${S.heading.L} {\n display: block;\n }\n\n @media screen and ${({ isEditMode }) =>\n isEditMode ? BREAKPOINTS.LAPTOP : MIDDLE_TABLET_LAPTOP_BREAKPOINT} and (max-width: 1100px) {\n ${S.heading.XL} {\n display: block;\n }\n ${S.heading.L} {\n display: none;\n }\n }\n`\n\nconst Content = styled.div<{ isEditMode: boolean }>`\n @media screen and ${({ isEditMode }) => (isEditMode ? BREAKPOINTS.LAPTOP : MIDDLE_TABLET_LAPTOP_BREAKPOINT)} {\n display: inline-block;\n margin: 0 auto;\n max-width: ${({ isEditMode }) => (isEditMode ? '70%' : '80%')};\n position: relative;\n width: auto;\n z-index: 2;\n }\n`\n\nconst EditViewStyled = styled.div<{ isEditMode: boolean }>`\n text-align: center;\n\n ${S.heading.M} {\n display: none;\n }\n ${S.heading.L} {\n display: block;\n }\n\n @media screen and ${({ isEditMode }) =>\n isEditMode ? BREAKPOINTS.LAPTOP : MIDDLE_TABLET_LAPTOP_BREAKPOINT} and (max-width: 1100px) {\n ${S.heading.M} {\n display: block;\n }\n ${S.heading.L} {\n display: none;\n }\n }\n`\n\nconst HeadingWrapper = styled.div<{ isEditMode: boolean }>`\n display: block;\n padding: 22px 10px;\n\n @media screen and ${({ isEditMode }) => (isEditMode ? BREAKPOINTS.LAPTOP : MIDDLE_TABLET_LAPTOP_BREAKPOINT)} {\n margin: 0 auto;\n padding: 20px 0;\n position: relative;\n text-align: center;\n }\n`\n\nconst EditButtonWrapper = styled.div<{ isEditMode: boolean }>`\n position: relative;\n margin-top: 5px;\n z-index: 2;\n\n @media screen and ${({ isEditMode }) => (isEditMode ? BREAKPOINTS.LAPTOP : MIDDLE_TABLET_LAPTOP_BREAKPOINT)} {\n margin: 0px;\n position: absolute;\n right: -115px;\n top: 50%;\n transform: translateY(-50%);\n }\n`\n\nconst AdviceLinkWrapper = styled(S.copy.S)`\n align-items: center;\n display: flex;\n justify-content: center;\n margin-top: 4px;\n`\n", "import * as React from 'react'\nimport { Link as RouterLink } from 'react-router-dom'\n\nimport styled from 'styled-components'\n\nimport { formatDistanceToNow } from '@owl-nest/date'\nimport { useInterval, SocketEventType, SocketEvent, SocketReturn } from '@owl-nest/hooks'\nimport { t, tn } from '@owl-nest/localize'\n\nimport { BREAKPOINTS, Link, glyphs, styles as S } from '@ulule/owl-kit-components/next'\n\nimport * as UFE from '../../../../../UFE'\nimport { useNavigation } from '../../../../hooks/useNavigation'\nimport { PATHS } from '../../../../paths'\n\ntype LiveEventsProps = {\n socket: SocketReturn\n}\n\nexport function LiveEvents({ socket }: LiveEventsProps): React.ReactElement {\n const navigation = useNavigation()\n\n const [indexToShow, setIndexToShow] = React.useState<number>(0)\n const [fade, setFade] = React.useState(false)\n const indexEventKeys: SocketEventType | undefined = socket.events?.events\n ? (Object.keys(socket.events.events)[indexToShow] as SocketEventType)\n : undefined\n\n useInterval(changeEventShowed, 5000)\n\n React.useEffect(() => {\n setTimeout(function () {\n setFade(false)\n }, 300)\n }, [indexToShow])\n\n if (indexEventKeys !== undefined) {\n const eventToTemplate = socket.events?.events[indexEventKeys]\n const templatedEvent = eventToTemplate && templateEvent(eventToTemplate)\n return <LiveNews fade={fade}>{UFE.FLAGS.liveVisitorsCountDisplay && <>{templatedEvent}</>}</LiveNews>\n } else {\n return <></>\n }\n\n function changeEventShowed(): void {\n if (socket.events?.events && Object.keys(socket.events.events).length > 1) {\n setFade(true)\n\n setTimeout(function () {\n const nbEvent = socket.events ? Object.keys(socket.events.events).length - 1 : 0\n if (indexToShow < nbEvent) setIndexToShow(indexToShow + 1)\n else setIndexToShow(0)\n }, 300)\n } else setIndexToShow(0)\n }\n\n function templateEvent(event: SocketEvent): JSX.Element | undefined {\n let templatedEvent\n const lastEventIndex = Array.isArray(event?.data) ? event?.data?.length - 1 : 0\n\n switch (event?.event_type) {\n case SocketEventType.NEWS_PUBLISHED:\n // show if piece of news was published less than 24 hours ago\n templatedEvent = (\n <S.heading.Card1>\n <Link href={event?.data[lastEventIndex]?.absolute_url}>\n <glyphs.twoToned.PaperPlane size={22} />\n {t('The project team posted a post today')}\n </Link>\n </S.heading.Card1>\n )\n\n break\n\n case SocketEventType.ORDER:\n // Show if new backers during session or less than 30min ago\n templatedEvent = (\n <S.heading.Card1>\n <Link as={RouterLink} to={navigation.pathTo(PATHS.REWARDS)}>\n <glyphs.twoToned.Owl size={22} />\n {t('%(backer)s backed this project %(time)s ago', {\n backer: event?.data[lastEventIndex]?.user?.name,\n time: formatDistanceToNow(new Date(event?.data[lastEventIndex]?.created_at)),\n })}\n </Link>\n </S.heading.Card1>\n )\n\n break\n\n case SocketEventType.BACKERS:\n // Number of backers during last 24 hours\n templatedEvent = (\n <S.heading.Card1>\n <glyphs.twoToned.Owl size={22} />\n {t('%(count)d people backed the project today', { count: event?.data?.count })}\n </S.heading.Card1>\n )\n\n break\n\n case SocketEventType.VISITOR:\n templatedEvent = (\n // Current visitor count\n <S.heading.Card1>\n <glyphs.twoToned.Binoculars size={22} />\n {tn(\n '%(count)d visitor currently viewing this page',\n '%(count)d visitors currently viewing this page',\n event?.data?.count,\n {\n count: event?.data?.count,\n },\n )}\n </S.heading.Card1>\n )\n\n break\n\n default:\n break\n }\n return templatedEvent\n }\n}\n\nconst LiveNews = styled.div<{ fade: boolean }>`\n opacity: ${({ fade }) => (fade ? '0' : '1')};\n transition: 0.3s ease-in-out;\n\n ${glyphs.Icon} {\n margin-right: 10px;\n }\n\n ${Link} {\n text-decoration: none;\n color: inherit;\n }\n\n @media screen and ${BREAKPOINTS.TABLET} {\n text-align: right;\n }\n`\n", "import * as React from 'react'\nimport * as Redux from 'react-redux'\nimport styled from 'styled-components'\n\nimport * as plume from '@ulule/owl-kit-components/next'\nimport { BREAKPOINTS, COLORS, Link, glyphs, styles as S } from '@ulule/owl-kit-components/next'\nimport * as model from '@owl-nest/models'\n\nimport { useDisplayMode } from '../../../../hooks/useDisplayMode'\nimport { useNavigation } from '../../../../hooks/useNavigation'\nimport { Project, ExtraFields } from '../../../../models/project'\nimport { PATHS } from '../../../../paths'\nimport { RootState } from '../../../../../reducers'\nimport { MIDDLE_TABLET_LAPTOP_BREAKPOINT } from '../../constants'\n\ntype OwnerProps = {\n className?: string\n}\n\nfunction OwnerComponent({ className }: OwnerProps): React.ReactElement<OwnerProps> {\n const project = Redux.useSelector<RootState, Project>((state) => state.application.project.data)\n const mainTag = model.project.mainTag<ExtraFields>(project)\n const navigation = useNavigation()\n\n const avatar = model.user.avatar(project.owner, '55x55')\n\n const displayMode = useDisplayMode(project)\n const isEditMode = displayMode === 'edit'\n\n function handleClick(): void {\n const path = document.location.pathname\n if (path !== project.absolute_url) {\n navigation.to(PATHS.PROJECT, {\n scrollTarget: 'about-owner',\n })\n } else {\n document.location.hash = 'about-owner'\n }\n }\n\n return (\n <InfoCard className={className}>\n <InfoCardItem>\n {avatar && <plume.styles.image.Avatar onClick={handleClick} src={avatar} type=\"medium\" />}\n <InfoCardContent>\n <S.heading.XXXS onClick={handleClick}>{model.user.username(project.owner)}</S.heading.XXXS>\n <InfoCardTags isEditMode={isEditMode}>\n {(project.city || project.owner.location) && (\n <InfoCardTag>\n <glyphs.stroke.MapCursor size={13} />\n {project.city || project.owner.location}\n </InfoCardTag>\n )}\n {mainTag && (\n <Link kind=\"secondary\" withIcon href={project.main_tag?.absolute_url}>\n <InfoCardTag>\n <glyphs.stroke.Tag size={13} />\n {mainTag}\n </InfoCardTag>\n </Link>\n )}\n </InfoCardTags>\n </InfoCardContent>\n </InfoCardItem>\n </InfoCard>\n )\n}\n\nexport const Owner = styled(OwnerComponent)``\n\nconst InfoCard = styled.div<{ className?: string }>`\n ${S.heading.Card1} {\n margin-bottom: 10px;\n }\n`\n\nconst InfoCardTag = styled(S.heading.Card1)`\n display: flex;\n align-items: center;\n\n ${glyphs.SizedSvg} {\n color: ${COLORS.GREY_SHADE_7};\n }\n`\n\nconst InfoCardTags = styled.div<{ isEditMode: boolean }>`\n display: flex;\n margin-top: 5px;\n\n ${Link} {\n cursor: pointer;\n }\n\n div + ${Link} {\n margin-left: 14px;\n\n @media screen and ${({ isEditMode }) => (isEditMode ? BREAKPOINTS.LAPTOP : MIDDLE_TABLET_LAPTOP_BREAKPOINT)} {\n margin-left: 20px;\n }\n }\n`\n\nconst InfoCardContent = styled.div`\n display: flex;\n flex-direction: column;\n\n ${S.heading.XXXS} {\n cursor: pointer;\n }\n\n @media screen and ${plume.BREAKPOINTS.TABLET} {\n right: 0;\n top: 20px;\n }\n`\n\nconst InfoCardItem = styled.div`\n display: flex;\n align-items: center;\n\n ${plume.styles.image.Avatar} {\n cursor: pointer;\n background-color: ${plume.COLORS.PRIMARY_WHITE};\n margin-right: 20px;\n }\n }\n`\n", "import * as React from 'react'\nimport * as Redux from 'react-redux'\nimport styled from 'styled-components'\n\nimport * as plume from '@ulule/owl-kit-components/next'\n\nimport * as shadow from '@owl-nest/shadow'\nimport * as model from '@owl-nest/models'\n\nimport { DisplayMode } from '../../../../context'\nimport * as projectModel from '../../../../models/project'\nimport { RootState } from '../../../../../reducers'\nimport { MIDDLE_TABLET_LAPTOP_BREAKPOINT } from '../../constants'\n\nexport function PartnerRibbon(): React.ReactElement<unknown> | null {\n const ribbonRef = React.useRef(null)\n\n const project = Redux.useSelector<RootState, projectModel.Project>((state) => state.application.project.data)\n const partnerRibbonData = model.project.getRibbonData(project)\n const isEditMode = React.useContext(DisplayMode) === 'edit'\n\n shadow.usePartnershipTracker(partnerRibbonData?.partnerOwnerId, ribbonRef, {\n click: {\n enabled: false,\n },\n eventPosition: 'project-page-ribbon',\n impression: {\n enabled: true,\n once: true,\n },\n })\n\n if (partnerRibbonData && partnerRibbonData.ribbonImageUrl) {\n return (\n <Ribbon backgroundUrl={partnerRibbonData.ribbonImageUrl} isEditMode={isEditMode} ref={ribbonRef}>\n {/* eslint-disable-next-line jsx-a11y/anchor-has-content */}\n {!isEditMode && <a href={partnerRibbonData.partnerUrl} target=\"_blank\" rel=\"nooponer noreferrer\" />}\n </Ribbon>\n )\n }\n\n return null\n}\n\nexport const Ribbon = styled.div<{ backgroundUrl: string; isEditMode: boolean }>`\n background-image: url('${({ backgroundUrl }) => backgroundUrl}');\n background-repeat: no-repeat;\n background-size: cover;\n height: 90px;\n position: absolute;\n right: 0px;\n top: 0px;\n width: 103px;\n opacity: ${({ isEditMode }) => (isEditMode ? '50%' : '100%')};\n pointer-events: ${({ isEditMode }) => (isEditMode ? 'none' : 'all')};\n z-index: 2;\n\n @media screen and ${({ isEditMode }) => (isEditMode ? plume.BREAKPOINTS.LAPTOP : MIDDLE_TABLET_LAPTOP_BREAKPOINT)} {\n height: 160px;\n width: 177px;\n right: -1px;\n top: -1px;\n }\n\n a {\n display: block;\n height: 90px;\n position: absolute;\n right: 0;\n top: 0;\n width: 103px;\n\n @media screen and ${({ isEditMode }) => (isEditMode ? plume.BREAKPOINTS.LAPTOP : MIDDLE_TABLET_LAPTOP_BREAKPOINT)} {\n height: 160px;\n width: 177px;\n }\n }\n`\n", "import * as React from 'react'\nimport * as Redux from 'react-redux'\nimport styled, { css } from 'styled-components'\n\nimport * as consent from '@owl-nest/consent'\nimport { t, tc } from '@owl-nest/localize'\nimport * as model from '@owl-nest/models'\nimport {\n BREAKPOINTS,\n Callout,\n COLORS,\n glyphs,\n Link,\n LinkAsButton,\n styles as S,\n VideoLoader,\n} from '@ulule/owl-kit-components/next'\nimport * as env from '@owl-nest/config'\n\nimport { DisplayMode } from '../../../../context'\nimport * as projectModel from '../../../../models/project'\nimport { RootState } from '../../../../../reducers'\nimport * as UFE from '../../../../../UFE'\n\nimport { EDIT_MODE_LAPTOP_BREAKPOINT, MIDDLE_TABLET_LAPTOP_BREAKPOINT } from '../../constants'\n\nimport { CreateButton } from '../CreateButton'\nimport { EditButton } from '../EditButton'\nimport { AdviceModal } from '../AdviceModal'\n\nexport function PrimaryMedia(): React.ReactElement<unknown> {\n const project = Redux.useSelector<RootState, projectModel.Project>((state) => state.application.project.data)\n const media = useProjectMedia()\n const userConfig = env.useUserEnv()\n\n const displayMode = React.useContext(DisplayMode)\n const [isAdviceModalOpen, setAdviceModalOpen] = React.useState(false)\n const [isImageModalOpen, setImageModalOpen] = React.useState(false)\n const isEditMode = displayMode === 'edit'\n\n return (\n <PrimaryMediaView isEditMode={isEditMode && !model.project.refused<projectModel.ExtraFields>(project)}>\n {isEditMode && media.src === undefined ? (\n <CreateWrapper isEditMode={isEditMode && !model.project.refused<projectModel.ExtraFields>(project)}>\n <CreateButton\n center={true}\n createHandler={() => {\n document.location.href = `/projects/${project.id}/edit/layout/${userConfig.lang}/?image`\n }}\n cta={\n <LinkWrapper>\n <Link\n onClick={() => {\n setImageModalOpen(true)\n }}\n tinted\n withIcon\n >\n <glyphs.stroke.Bulb size={15} />\n {t('How to prepare your main image')}\n </Link>\n </LinkWrapper>\n }\n title={\n <CreateTitle>\n <S.heading.L asDesktop=\"M\">{t('Add an image or a gif')}</S.heading.L>\n </CreateTitle>\n }\n />\n {media.videoHtml ? (\n <EditButtonContainer>\n <EditButton link={`/projects/${project.id}/edit/layout/${userConfig.lang}/?video`}>\n {t('Edit video')}\n </EditButton>\n </EditButtonContainer>\n ) : (\n <Callout type=\"info\">\n {tc('[strong: Are you planning to make a video?] Even better! You can add it with your image.', {\n strong: <strong />,\n })}\n <S.copy.S>\n <Link\n onClick={() => {\n setAdviceModalOpen(true)\n }}\n tinted\n withIcon\n >\n <glyphs.stroke.Bulb size={15} />\n {t('How to create a beautiful video')}\n </Link>\n </S.copy.S>\n </Callout>\n )}\n </CreateWrapper>\n ) : (\n <>\n {media.videoHtml ? (\n <StyledVideoLoader\n alt={t('Video presentation of the project')}\n consentWall={consent.media.Wall}\n placeholder={media.src}\n provider={media.provider}\n srcSet={media.srcSet}\n videoHtml={media.videoHtml}\n isEditMode={isEditMode && !model.project.refused<projectModel.ExtraFields>(project)}\n />\n ) : (\n <Image\n src={media.src}\n srcSet={media.srcSet}\n alt={t('Cover image of the project %(title)s', {\n title: model.project.name<projectModel.ExtraFields>(project),\n })}\n />\n )}\n {isEditMode && !model.project.refused<projectModel.ExtraFields>(project) && getEditButtons()}\n </>\n )}\n <AdviceModal\n link={`/projects/${project.id}/edit/layout/?video`}\n open={isAdviceModalOpen}\n setOpen={setAdviceModalOpen}\n title={t('Add an image and/or a video')}\n videoHtml={\n userConfig.lang === 'fr'\n ? '<iframe allow=\"accelerometer; autoplay; encrypted-media;\" allowFullScreen frameBorder=\"0\" src=\"https://www.youtube.com/embed/oozewGzhFYY?autoplay=1\" title=\"video-placeholder\"/>'\n : '<iframe allow=\"accelerometer; autoplay; encrypted-media;\" allowFullScreen frameBorder=\"0\" src=\"https://www.youtube.com/embed/wQiYRkI3mm4?autoplay=1\" title=\"video-placeholder\" />'\n }\n />\n <AdviceModal\n ctaText={t('Add an image or a gif')}\n description={t(\n 'It will be the first glimpse of your project and will allow to identify it in the lists and on the social networks. Image format is 680x380 and up to 2040x1140 for optimal display on all screens. Choose a simple and clear visual that illustrates your project well. You can even add a gif!',\n )}\n link={`/projects/${project.id}/edit/layout/?video`}\n open={isImageModalOpen}\n setOpen={setImageModalOpen}\n title={t('Add an image or a gif')}\n imageSrc={UFE.IMAGES.adviceMainImage}\n />\n </PrimaryMediaView>\n )\n\n function getEditButtons(): React.ReactElement | void {\n if (media.videoHtml === undefined && media.src) {\n return (\n <EditButtonContainer>\n <AdviceVideoEditButton>\n <EditButton\n fullWidth={true}\n glyph={<glyphs.stroke.Plus size={18} />}\n link={`/projects/${project.id}/edit/layout/${userConfig.lang}/?video`}\n >\n {t('Add a video')}\n </EditButton>\n\n <AdviceVideo>\n <LinkAsButton\n darkened\n onClick={() => {\n setAdviceModalOpen(true)\n }}\n tinted\n withIcon\n >\n <glyphs.stroke.Bulb size={15} />\n {t('How to create a beautiful video')}\n </LinkAsButton>\n </AdviceVideo>\n </AdviceVideoEditButton>\n\n <EditButton link={`/projects/${project.id}/edit/layout/${userConfig.lang}/?image`}>\n {t('Edit image')}\n </EditButton>\n </EditButtonContainer>\n )\n } else if (media.videoHtml && media.src) {\n return (\n <EditButtonContainer>\n <EditButton link={`/projects/${project.id}/edit/layout/${userConfig.lang}/?video`}>\n {media.videoHtml && media.src ? t('Edit image or video') : t('Edit video')}\n </EditButton>\n </EditButtonContainer>\n )\n }\n }\n}\n\nfunction useProjectMedia(): { src?: string; srcSet?: string; videoHtml?: string; provider?: string } {\n const project = Redux.useSelector<RootState, projectModel.Project>((state) => state.application.project.data)\n\n const x2Image = model.project.mainImage<projectModel.ExtraFields>(project, '2x')\n const largeImage = model.project.mainImage<projectModel.ExtraFields>(project)\n const videoHtml = model.project.video<projectModel.ExtraFields>(project)?.html\n\n return {\n provider: model.project.video<projectModel.ExtraFields>(project)?.provider_name,\n src: largeImage,\n srcSet: `${x2Image} 2x, ${x2Image} 3x`,\n videoHtml,\n }\n}\n\nconst AdviceVideoEditButton = styled.div`\n position: relative;\n`\n\nconst AdviceVideo = styled(S.copy.S)`\n position: absolute;\n left: 50%;\n transform: translateX(-50%);\n width: fit-content;\n bottom: 14px;\n white-space: nowrap;\n\n ${LinkAsButton} {\n display: none;\n }\n\n @media screen and ${EDIT_MODE_LAPTOP_BREAKPOINT} {\n float: right;\n position: absolute;\n top: 10px;\n right: 24px;\n left: auto;\n bottom: auto;\n transform: translateX(0);\n\n ${LinkAsButton} {\n display: block;\n padding: 0;\n\n ${glyphs.stroke.Bulb} {\n margin-top: -4px;\n }\n }\n }\n`\n\nconst CreateTitle = styled.div`\n margin-bottom: 10px;\n text-align: center;\n\n @media screen and ${BREAKPOINTS.LAPTOP} {\n text-align: left;\n }\n`\n\nconst CreateWrapper = styled.div<{ isEditMode: boolean }>`\n align-items: center;\n background-color: ${COLORS.BLUE_SHADE_3};\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n height: 100%;\n justify-content: center;\n padding: 60px 8px 8px;\n position: relative;\n width: 100%;\n\n ${Callout} {\n text-align: center;\n margin-top: 14px;\n width: calc(100% - 20px);\n\n ${Link} {\n display: block;\n }\n\n ${glyphs.stroke.Bulb} {\n top: -2px;\n color: ${COLORS.GREY_SHADE_4};\n margin-right: 5px;\n }\n }\n\n ${Callout} {\n background-color: ${COLORS.PRIMARY_WHITE}; // HACK: Irregular background color manipulation\n }\n\n @media screen and ${({ isEditMode }) => (isEditMode ? BREAKPOINTS.LAPTOP : MIDDLE_TABLET_LAPTOP_BREAKPOINT)} {\n padding: 0px;\n\n ${Callout} {\n position: absolute;\n bottom: 10px;\n left: 10px;\n margin-top: 0px;\n\n ${Link} {\n display: block;\n }\n\n ${glyphs.stroke.Bulb} {\n top: -2px;\n color: ${COLORS.GREY_SHADE_4};\n margin-right: 5px;\n }\n }\n }\n`\n\nconst LinkWrapper = styled(S.copy.S)`\n position: relative;\n top: -25%;\n\n @media screen and (min-width: 1322px) {\n position: initial;\n top: initial;\n }\n`\n\nconst EditButtonContainer = styled.span`\n position: absolute;\n right: 10px;\n top: 0px;\n\n ${EditButton} {\n display: block;\n margin-top: 10px;\n }\n\n @media screen and ${BREAKPOINTS.TABLET} {\n ${EditButton} {\n margin-bottom: 10px;\n }\n }\n`\n\nconst Image = styled.img`\n display: block;\n object-fit: cover;\n height: 100%;\n width: 100%;\n`\n\nconst StyledVideoLoader = styled(VideoLoader)<{ isEditMode: boolean }>`\n width: 100%;\n\n @media screen and ${({ isEditMode }) => (isEditMode ? BREAKPOINTS.LAPTOP : MIDDLE_TABLET_LAPTOP_BREAKPOINT)} {\n max-width: 680px;\n }\n\n @media screen and ${BREAKPOINTS.LAPTOP_L} {\n width: 680px;\n }\n`\n\nconst PrimaryMediaView = styled.div<{ isEditMode: boolean }>`\n position: relative;\n width: 100%;\n\n ${Image} + ${EditButtonContainer} {\n position: absolute;\n bottom: 0px;\n left: 10px;\n\n ${AdviceVideoEditButton} {\n ${EditButton} {\n width: 100%;\n }\n }\n\n ${AdviceVideoEditButton} + ${EditButton} {\n float: right;\n }\n }\n\n @media screen and ${({ isEditMode }) => (isEditMode ? BREAKPOINTS.LAPTOP : MIDDLE_TABLET_LAPTOP_BREAKPOINT)} {\n max-height: 380px;\n max-width: 680px;\n\n ${({ isEditMode }) => {\n if (isEditMode) {\n return css`\n height: calc((63vw - 264px) * 9 / 16);\n width: calc(63vw - 264px);\n margin-right: 22px;\n `\n } else {\n return css`\n height: calc(54vw * 9 / 16);\n width: 54vw;\n margin-right: 0;\n `\n }\n }}\n }\n\n @media screen and ${BREAKPOINTS.LAPTOP_L} {\n margin-right: ${({ isEditMode }) => (isEditMode ? '32px' : '0')};\n height: 380px;\n width: 680px;\n }\n`\n", "import * as React from 'react'\nimport * as Redux from 'react-redux'\nimport styled from 'styled-components'\n\nimport { request } from '@owl-nest/api-client/latest'\nimport { usePoll } from '@owl-nest/hooks/src/usePoll'\nimport * as models from '@owl-nest/models'\nimport { BREAKPOINTS } from '@ulule/owl-kit-components/next'\nimport { renderConfetti } from '@owl-nest/confetti'\n\nimport * as UFE from '../../../../../UFE'\nimport * as projectModel from '../../../../models/project'\nimport { RootState } from '../../../../../reducers'\n\nimport { Orders } from './Orders'\nimport { Supporters } from './Supporters'\nimport { DateInfo } from './DateInfo'\nimport { Progress } from './Progress'\n\ntype RawStats = {\n amount_raised: string\n committed: number\n goal: number\n supporters_count: number\n orders_count: number\n}\n\ntype Stats = {\n amountRaised: number\n committed: number\n goal: number\n percent: number\n supportersCount: number\n ordersCount: number\n}\n\nexport function Statistics(): React.ReactElement<unknown> {\n const project = Redux.useSelector<RootState, projectModel.Project>((state) => state.application.project.data)\n\n const [stats, setStats] = React.useState<Stats>({\n ordersCount: project.orders_count,\n supportersCount: project.supporters_count,\n amountRaised: project.amount_raised,\n goal: project.goal,\n percent: models.project.progress<projectModel.ExtraFields>(project),\n committed: project.committed,\n })\n\n const [previousPercent, setPreviousPercent] = React.useState<number>(\n models.project.progress<projectModel.ExtraFields>(project),\n )\n\n const poller = usePoll(async () => {\n const url = new URL(UFE.LIVE_URL, base())\n url.search = new URLSearchParams({ cachebuster: String(Date.now()) }).toString()\n const response = await request<RawStats>(url.toString())\n const data = response.doThrow()\n // `goal` is not set for some old projects.\n // For these projects, we have to use the already known goal from the project resource.\n const goal = data.body.goal || project.goal\n\n setStats({\n ordersCount: data.body.orders_count || project.orders_count,\n supportersCount: data.body.supporters_count || project.supporters_count,\n amountRaised: Number(data.body.amount_raised),\n goal: goal,\n percent: goal > 0 ? Math.floor((data.body.committed * 100) / goal) : 0,\n committed: data.body.committed,\n })\n })\n\n React.useEffect(() => {\n if (UFE.FLAGS.liveEnabled && project.is_online && !project.finished && project.orders_count > 1) {\n poller.start()\n return () => poller.stop()\n }\n }, [])\n\n React.useEffect(() => {\n if (previousPercent < 100) {\n if (stats.percent >= 100) {\n renderConfetti()\n }\n setPreviousPercent(stats.percent)\n }\n }, [stats.percent])\n\n // We display DateInfo for:\n //- rewards projects\n //- non finished donation projects with date_end set in the future (we have to hide the component if date is passed but campaign is still ongoing)\n //- finished donation projects\n //- non finished donation projects with nb_days set\n const displayDateInfo =\n !models.project.isDonationBased(project) ||\n (project.date_end && new Date(project.date_end) >= new Date()) ||\n project.finished ||\n (!project.date_end && project.nb_days)\n\n return (\n <>\n <Progress\n amountRaised={stats.amountRaised}\n committed={stats.committed}\n goal={stats.goal}\n percent={stats.percent}\n />\n\n <Line>\n {stats.ordersCount ? (\n <Orders ordersCount={stats.ordersCount} />\n ) : (\n <Supporters supportersCount={stats.supportersCount} />\n )}\n {displayDateInfo && <DateInfo />}\n </Line>\n </>\n )\n\n function base() {\n const split = window.location.href.split('/')\n return split[0] + '//' + split[2]\n }\n}\n\nconst Line = styled.div`\n display: flex;\n flex-direction: column;\n\n @media screen and ${BREAKPOINTS.TABLET} {\n flex-direction: row;\n justify-content: space-between;\n }\n`\n", "import * as React from 'react'\nimport * as Redux from 'react-redux'\nimport styled from 'styled-components'\n\nimport { tn } from '@owl-nest/localize'\nimport * as model from '@owl-nest/models'\nimport { styles as S } from '@ulule/owl-kit-components/next'\nimport { text } from '@owl-nest/utils'\n\nimport * as projectModel from '../../../../models/project'\nimport { RootState } from '../../../../../reducers'\n\nimport { useNavigation } from '../../../../hooks/useNavigation'\nimport { PATHS } from '../../../../paths'\n\nimport { Diptych } from './Diptych'\nimport { AnimateCounter } from '../AnimateCounter'\n\ntype OrdersProps = {\n ordersCount: number\n}\n\nexport function Orders({ ordersCount }: OrdersProps): React.ReactElement<OrdersProps> {\n const navigation = useNavigation()\n const project = Redux.useSelector<RootState, projectModel.Project>((state) => state.application.project.data)\n\n return (\n <Diptych\n handlers={{\n onClick: () => {\n navigation.to(PATHS.SUPPORTERS)\n },\n onMouseEnter: () => {},\n onMouseLeave: () => {},\n onTouchStart: () => {},\n }}\n leftZone={\n project.latest_supporter && (\n <S.image.Avatar src={model.user.avatar(project.latest_supporter, '40x40')} type=\"extra-small\" />\n )\n }\n rightZone={\n <Content>\n <AnimateCounter id={ordersCount}>\n <S.heading.XS>{project.is_online ? text.numberToLocaleString(ordersCount) : '\u2014'}</S.heading.XS>\n </AnimateCounter>\n <S.copy.S> {tn('contribution', 'contributions', ordersCount)}</S.copy.S>\n </Content>\n }\n />\n )\n}\n\nconst Content = styled.div`\n display: flex;\n align-items: baseline;\n margin-left: 6px;\n`\n", "import * as React from 'react'\nimport styled, { css } from 'styled-components'\n\nimport { BREAKPOINTS, styles as S } from '@ulule/owl-kit-components/next'\n\ntype DiptychProps = {\n handlers?: {\n onClick: () => void\n onMouseEnter: () => void\n onMouseLeave: () => void\n onTouchStart: () => void\n }\n leftZone: React.ReactNode\n rightZone: React.ReactNode\n className?: string\n}\n\nconst DiptychView = styled.div`\n align-items: center;\n display: flex;\n margin-bottom: 25px;\n min-width: 130px;\n position: relative;\n white-space: nowrap;\n\n @media screen and ${BREAKPOINTS.MOBILE_M} {\n min-width: 160px;\n }\n\n ${S.tooltip.Tooltip} {\n bottom: 50px;\n }\n`\n\nfunction DiptychComponent({\n handlers,\n leftZone,\n rightZone,\n className,\n}: DiptychProps): React.ReactElement<DiptychProps> {\n return (\n <DiptychView\n onClick={handlers?.onClick}\n onMouseEnter={handlers?.onMouseEnter}\n onMouseLeave={handlers?.onMouseLeave}\n onTouchStart={handlers?.onTouchStart}\n className={className}\n >\n {leftZone}\n {rightZone}\n </DiptychView>\n )\n}\n\nexport const Diptych = styled(DiptychComponent)``\n", "import * as React from 'react'\nimport styled, { keyframes } from 'styled-components'\n\ntype AnimateCounterProps = {\n children: React.ReactNode\n id: number | string\n}\n\nexport function AnimateCounter({ children, id }: AnimateCounterProps): React.ReactElement<AnimateCounterProps> {\n const [state, setState] = React.useState<'stable' | 'transition'>('stable')\n const animatedRef = React.useRef<HTMLDivElement>(null)\n const childrenRef = React.useRef(children)\n const currentIdRef = React.useRef(id)\n\n React.useEffect(() => {\n if (currentIdRef.current !== id) {\n setState('transition')\n }\n }, [id])\n\n React.useLayoutEffect(() => {\n if (animatedRef.current !== null) {\n animatedRef.current.addEventListener('animationend', onTransitionEnd)\n }\n return () => {\n if (animatedRef.current !== null) {\n animatedRef.current.removeEventListener('animationend', onTransitionEnd)\n }\n }\n }, [state])\n\n if (state === 'stable') {\n return <>{childrenRef.current}</>\n }\n\n return (\n <Wrapper>\n <AnimatedExit>{childrenRef.current}</AnimatedExit>\n <AnimatedEnter ref={animatedRef}>{children}</AnimatedEnter>\n </Wrapper>\n )\n\n function onTransitionEnd(): void {\n childrenRef.current = children\n currentIdRef.current = id\n setState('stable')\n }\n}\n\nconst exitTop = keyframes`\n from { \n transform: translateY(0%);\n }\n to { \n transform: translateY(-100%);\n }\n`\n\nconst enterBottom = keyframes`\n from { \n transform: translateY(100%);\n }\n to { \n transform: translateY(0%);\n }\n`\n\nconst AnimatedEnter = styled.div`\n animation: 0.15s ${enterBottom} ease-in-out;\n`\n\nconst AnimatedExit = styled.div`\n animation: 0.15s ${exitTop} ease-in-out;\n`\n\nconst Wrapper = styled.div`\n position: relative;\n overflow: hidden;\n\n ${AnimatedEnter} {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n overflow: hidden;\n }\n`\n", "import * as React from 'react'\nimport * as Redux from 'react-redux'\nimport styled from 'styled-components'\n\nimport { tn } from '@owl-nest/localize'\nimport * as model from '@owl-nest/models'\nimport { styles as S } from '@ulule/owl-kit-components/next'\nimport { text } from '@owl-nest/utils'\n\nimport * as projectModel from '../../../../models/project'\nimport { RootState } from '../../../../../reducers'\n\nimport { useNavigation } from '../../../../hooks/useNavigation'\nimport { PATHS } from '../../../../paths'\n\nimport { Diptych } from './Diptych'\nimport { AnimateCounter } from '../AnimateCounter'\n\ntype SupportersProps = {\n supportersCount: number\n}\n\nexport function Supporters({ supportersCount }: SupportersProps): React.ReactElement<SupportersProps> {\n const navigation = useNavigation()\n const project = Redux.useSelector<RootState, projectModel.Project>((state) => state.application.project.data)\n\n return (\n <Diptych\n handlers={{\n onClick: () => {\n navigation.to(PATHS.SUPPORTERS)\n },\n onMouseEnter: () => {},\n onMouseLeave: () => {},\n onTouchStart: () => {},\n }}\n leftZone={\n project.latest_supporter && (\n <S.image.Avatar src={model.user.avatar(project.latest_supporter, '40x40')} type=\"extra-small\" />\n )\n }\n rightZone={\n <Content>\n <AnimateCounter id={supportersCount}>\n <S.heading.XS>{project.is_online ? text.numberToLocaleString(supportersCount) : '\u2014'}</S.heading.XS>\n </AnimateCounter>\n <S.copy.S> {tn('contribution', 'contributions', supportersCount)}</S.copy.S>\n </Content>\n }\n />\n )\n}\n\nconst Content = styled.div`\n display: flex;\n align-items: baseline;\n margin-left: 6px;\n`\n", "import * as React from 'react'\nimport * as Redux from 'react-redux'\nimport styled, { css } from 'styled-components'\n\nimport * as date from '@owl-nest/date'\nimport { t } from '@owl-nest/localize'\nimport * as model from '@owl-nest/models'\nimport * as plume from '@ulule/owl-kit-components/next'\nimport * as hooks from '@owl-nest/hooks'\n\nimport * as projectModel from '../../../../models/project'\nimport { RootState } from '../../../../../reducers'\n\nimport { Diptych } from './Diptych'\n\nexport function DateInfo(): React.ReactElement<unknown> {\n const project = Redux.useSelector<RootState, projectModel.Project>((state) => state.application.project.data)\n\n const endDate = model.project.hadExtraTime<projectModel.ExtraFields>(project)\n ? date.parseISO(project.date_end_extra_time ?? '')\n : project.date_end && date.parseISO(project.date_end)\n const startDate = project.date_start && date.parseISO(project.date_start)\n\n const [isTooltipOpen, setToolTipOpen] = React.useState(false)\n\n const eventHandlers = {\n onClick: () => {},\n onMouseEnter: () => {\n setToolTipOpen(true)\n },\n onMouseLeave: () => {\n setToolTipOpen(false)\n },\n onTouchStart: () => {\n setToolTipOpen(!isTooltipOpen)\n },\n }\n\n if (!startDate || !endDate) {\n const remainingDays = endDate || !project.nb_days ? '\u2014' : project.nb_days\n console.warn('Project is missing end date and/or start date.', { endDate, startDate })\n return (\n <Diptych\n handlers={eventHandlers}\n leftZone={\n <>\n {endDate && (\n <plume.styles.tooltip.BlockAnchor>\n <plume.styles.tooltip.Tooltip open={isTooltipOpen} fitToContent>\n <plume.styles.copy.S>\n {t('Planned end date: %(date)s', { date: date.format(endDate, 'PPP') })}\n </plume.styles.copy.S>\n </plume.styles.tooltip.Tooltip>\n </plume.styles.tooltip.BlockAnchor>\n )}\n </>\n }\n rightZone={\n <Content column={false}>\n <plume.styles.heading.XS>{remainingDays}</plume.styles.heading.XS>\n <plume.styles.copy.S> {t('days left')}</plume.styles.copy.S>\n </Content>\n }\n />\n )\n }\n\n const formattedEndDate = date.format(endDate, 'PPP')\n const formattedEndTime = date.format(endDate, 'p')\n const formattedStartDate = date.format(startDate, 'PPP')\n\n const remainingTime = hooks.useDateCountdown(endDate, { reloadOnEnd: true })\n\n const isFinished = model.project.isFinished<projectModel.ExtraFields>(project)\n\n return (\n <DiptychStyled\n extraTime={project.is_in_extra_time}\n handlers={eventHandlers}\n leftZone={\n <>\n <plume.styles.tooltip.BlockAnchor>\n <plume.styles.tooltip.Tooltip fitToContent open={isTooltipOpen}>\n <plume.styles.copy.S>\n {t('Launched on %(date)s', { date: formattedStartDate })}\n <br />\n {endDate &&\n (project.finished\n ? t('Campaign ended %(date)s', { date: formattedEndDate })\n : t('Ends %(date)s at %(time)s', { date: formattedEndDate, time: formattedEndTime }))}\n </plume.styles.copy.S>\n </plume.styles.tooltip.Tooltip>\n <>{getPicto()}</>\n </plume.styles.tooltip.BlockAnchor>\n </>\n }\n rightZone={\n <>\n {project.finished ? (\n <Content column={true}>\n <plume.styles.copy.S>\n {project.is_in_extra_time ? (\n <strong>{t('Extension!')} </strong>\n ) : (\n <>\n <strong>{t('Campaign ended')} </strong>\n <plume.styles.copy.S>{getDescription()}</plume.styles.copy.S>\n </>\n )}\n </plume.styles.copy.S>\n </Content>\n ) : (\n <Content column={false}>\n <plume.styles.heading.XS>{remainingTime.value}</plume.styles.heading.XS>\n <plume.styles.copy.S> {getDescription()}</plume.styles.copy.S>\n </Content>\n )}\n </>\n }\n />\n )\n\n function getPicto(): React.ReactElement<unknown> {\n if (project.is_in_extra_time) {\n return <plume.glyphs.twoToned.StopwatchPlus size={34} />\n } else if (!isFinished && remainingTime.endingSoon) {\n return <plume.glyphs.twoToned.Stopwatch size={34} />\n }\n return <plume.glyphs.twoToned.Calendar size={34} />\n }\n\n function getDescription(): string {\n if (!project.is_in_extra_time) {\n if (isFinished && endDate) {\n return getRelativeEndDate(endDate)\n } else {\n return remainingTime.label\n }\n } else {\n return ''\n }\n }\n}\n\nfunction getRelativeEndDate(endDate: Date | number): string {\n const differenceInCalendarDays = date.differenceInCalendarDays(endDate, Date.now())\n if (differenceInCalendarDays === -1) {\n return t('yesterday')\n } else if (differenceInCalendarDays === 0) {\n return t('today')\n }\n\n const formattedEndDate = date.format(endDate, 'PPP')\n return t('the %(date)s', { date: formattedEndDate })\n}\n\nconst DiptychStyled = styled(Diptych)<{ extraTime: boolean }>`\n ${({ extraTime = false }) => {\n if (extraTime) {\n return css`\n align-items: center;\n `\n }\n }}\n\n /* NOT SCREEN */\n @media not screen and ${plume.BREAKPOINTS.TABLET} {\n ${plume.styles.tooltip.Tooltip} {\n left: 130px;\n }\n }\n`\n\nconst Content = styled.div<{ column: boolean }>`\n display: flex;\n align-items: baseline;\n margin-left: 6px;\n\n ${({ column = false }) => {\n if (column) {\n return css`\n flex-direction: column;\n `\n }\n }}\n`\n", "import * as React from 'react'\nimport * as Redux from 'react-redux'\nimport styled from 'styled-components'\n\nimport * as api from '@owl-nest/api-client/latest'\nimport { t, tn, tc } from '@owl-nest/localize'\nimport { MoneyDisplayer } from '@owl-nest/money'\nimport * as models from '@owl-nest/models'\nimport { text } from '@owl-nest/utils'\nimport * as env from '@owl-nest/config'\n\nimport { LocaleMoneyDisplayer } from '@ulule/owl-kit-components/next'\nimport * as plume from '@ulule/owl-kit-components/next'\n\nimport { DisplayMode } from '../../../../context'\nimport * as projectModel from '../../../../models/project'\nimport { RootState } from '../../../../../reducers'\n\nimport { EditButton } from '../EditButton'\nimport { Triptych } from './Triptych'\nimport { AnimateCounter } from '../AnimateCounter'\nimport { MIDDLE_TABLET_LAPTOP_BREAKPOINT } from '../../constants'\n\ntype ProgressProps = {\n percent: number\n amountRaised: number\n committed: number\n goal: number\n}\n\nexport function Progress({ percent, amountRaised, committed, goal }: ProgressProps): React.ReactElement<ProgressProps> {\n const project = Redux.useSelector<RootState, projectModel.Project>((state) => state.application.project.data)\n const displayMode = React.useContext(DisplayMode)\n\n const userCurrency = env.getUserConfig().currency\n const userLocale = env.getUserConfig().lang\n const conversionNeeded = userCurrency !== project.currency\n const ConversionIcon = getCurrencyIcon(userCurrency)\n\n const isPresale = project.type === 'presale'\n const isDonationBased = models.project.isDonationBased(project)\n const isEditMode = displayMode === 'edit'\n const isFinishedAndFunded = models.project.success<projectModel.ExtraFields>(project)\n\n return (\n <ProgressView isEditMode={isEditMode}>\n {!isDonationBased && isFinishedAndFunded && (\n <FinishedAndFundedLabel>{t('Successfully funded!')}</FinishedAndFundedLabel>\n )}\n <Triptych\n description={goal ? <ProgressDescription goal={goal} percent={percent} project={project} /> : null}\n leftZone={\n isDonationBased ? (\n <plume.illustrations.twoToned.EggCoin size={54} noBackground />\n ) : isFinishedAndFunded ? (\n <plume.glyphs.twoToned.EggFunded size={52} />\n ) : (\n <plume.glyphs.crowdfunding.ProgressEgg progress={percent} size={52} />\n )\n }\n title={\n <GoalWrapper>\n <plume.styles.heading.L>\n {project.is_online ? (\n isPresale ? (\n <AnimateCounter id={committed}>{text.numberToLocaleString(committed)}</AnimateCounter>\n ) : (\n <AnimateCounter id={amountRaised}>\n <MoneyDisplayer amount={amountRaised} project={project} />\n </AnimateCounter>\n )\n ) : (\n '\u2014'\n )}\n </plume.styles.heading.L>\n {conversionNeeded && !isPresale && env.CURRENCIES_RATES && (\n <ConversionWrapper>\n <ConversionIcon size={14} />\n ~\n <LocaleMoneyDisplayer\n rates={env.CURRENCIES_RATES}\n amount={amountRaised}\n currency={project.currency}\n targetCurrency={userCurrency}\n localeFormat={userLocale}\n />\n </ConversionWrapper>\n )}\n </GoalWrapper>\n }\n />\n {isEditMode &&\n !models.project.refused<projectModel.ExtraFields>(project) &&\n project.user_role === api.UserRole.Owner && (\n <EditButtonContainer>\n <EditButton link={`/projects/${project.id}/backoffice/goal`} />\n </EditButtonContainer>\n )}\n </ProgressView>\n )\n}\n\ntype ProgressDescriptionProps = {\n goal: number\n percent: number\n precision?: number\n project: projectModel.Project\n}\n\nfunction ProgressDescription({\n goal,\n percent,\n precision,\n project,\n}: ProgressDescriptionProps): React.ReactElement<ProgressDescriptionProps> {\n const userCurrency = env.getUserConfig().currency\n const userLocale = env.getUserConfig().lang\n const conversionNeeded = userCurrency !== project.currency\n const ConversionIcon = getCurrencyIcon(userCurrency)\n const isPresale = project.type === 'presale'\n\n return (\n <>\n <Tag backgroundColor={project.goal_raised ? 'secondary-green-500' : 'primary-blue-900'}>\n <AnimateCounter id={percent}>{`${text.numberToLocaleString(percent)} %`} </AnimateCounter>\n </Tag>\n {isPresale\n ? tn(\n 'presale out of goal of %(goal)s',\n 'presales out of goal of %(goal)s',\n text.numberToLocaleString(project.committed),\n {\n goal: text.numberToLocaleString(goal),\n },\n )\n : tc('out of goal of [goal]', {\n goal: <MoneyDisplayer amount={goal} project={project} />,\n })}\n {conversionNeeded && !isPresale && env.CURRENCIES_RATES && (\n <ConversionWrapperGoal>\n <ConversionIcon size={14} />\n ~\n <LocaleMoneyDisplayer\n rates={env.CURRENCIES_RATES}\n amount={goal}\n currency={project.currency}\n targetCurrency={userCurrency}\n localeFormat={userLocale}\n precision={precision}\n />\n </ConversionWrapperGoal>\n )}\n </>\n )\n}\n\nfunction getCurrencyIcon(currency: string | undefined): React.ComponentType<any> {\n let iconName = 'Dolls'\n\n if (currency === 'EUR') {\n iconName = 'Eur'\n } else if (currency === 'CHF') {\n iconName = 'Chf'\n } else if (currency === 'DKK' || currency === 'NOK' || currency === 'SEK') {\n iconName = 'Kr'\n } else if (currency === 'GBP') {\n iconName = 'Pound'\n }\n\n return (plume.glyphs as any)['currencies'][`${iconName}`]\n}\n\nconst EditButtonContainer = styled.span`\n position: absolute;\n right: 0;\n top: 0;\n z-index: 1;\n\n @media screen and ${plume.BREAKPOINTS.LAPTOP} {\n top: -15px;\n }\n`\n\nconst ProgressView = styled.div<{ isEditMode: boolean }>`\n position: relative;\n\n ${plume.glyphs.crowdfunding.ProgressEgg} {\n margin-right: 5px;\n width: 40px;\n }\n\n ${plume.styles.tag.RoleTag} {\n margin-right: 6px;\n margin-top: 6px;\n line-height: 19px;\n }\n\n @media screen and ${({ isEditMode }) => (isEditMode ? plume.BREAKPOINTS.LAPTOP : MIDDLE_TABLET_LAPTOP_BREAKPOINT)} {\n margin-top: 0;\n }\n`\n\nconst GoalWrapper = styled.div`\n display: flex;\n align-items: baseline;\n`\n\nconst ConversionWrapper = styled.span`\n color: ${plume.COLORS.TEXT_TERTIARY};\n display: inline-block;\n font-size: 11px;\n line-height: 16px;\n vertical-align: middle;\n padding-left: 10px;\n\n ${plume.glyphs.Icon} {\n color: ${plume.COLORS.PRIMARY_GREY_500};\n margin-right: 4px;\n }\n`\n\nconst ConversionWrapperGoal = styled(ConversionWrapper)`\n margin-left: 0;\n margin-top: 3px;\n padding-left: 0;\n\n @media screen and ${plume.BREAKPOINTS.MOBILE_L} {\n margin-left: 10px;\n margin-top: 0;\n }\n\n ${plume.glyphs.Icon} {\n color: ${plume.COLORS.PRIMARY_GREY_500};\n margin-right: 4px;\n }\n`\n\nconst FinishedAndFundedLabel = styled(plume.styles.heading.S)`\n padding-bottom: 20px;\n`\n\n// HACK: This is an exceptional use of RoleTag outside of its predefined scope, following a request from the Product team to keep the design untouched for now.\n// Context: https://ulule.slack.com/archives/GN6FCB4JF/p1720095898486839\nconst Tag = styled(plume.RoleTag)`\n font-size: 15px; // HACK: Irregular font manipulation\n line-height: 17px;\n`\n", "import * as React from 'react'\nimport styled, { css } from 'styled-components'\n\nimport { BREAKPOINTS, styles as S } from '@ulule/owl-kit-components/next'\n\ntype TriptychProps = {\n description: React.ReactNode\n handlers?: {\n onClick: () => void\n onMouseEnter: () => void\n onMouseLeave: () => void\n onTouchStart: () => void\n }\n leftZone: React.ReactNode\n title: React.ReactNode\n className?: string\n}\n\nconst DescriptionInfo = styled(S.copy.S)`\n align-items: baseline;\n display: flex;\n margin-top: 1px;\n flex-wrap: wrap;\n\n @media screen and ${BREAKPOINTS.TABLET} {\n flex-wrap: nowrap;\n }\n`\n\nconst RightColumn = styled.div<{ centerSelf: boolean }>`\n margin-left: 10px;\n\n ${({ centerSelf }) => {\n if (centerSelf) {\n return css`\n align-self: center;\n margin-top: -10px;\n `\n }\n }}\n`\n\nconst TriptychView = styled.div`\n align-items: flex-end;\n display: flex;\n margin-bottom: 25px;\n min-width: 130px;\n position: relative;\n white-space: nowrap;\n\n @media screen and ${BREAKPOINTS.MOBILE_M} {\n min-width: 160px;\n }\n\n ${S.tooltip.Tooltip} {\n bottom: 50px;\n }\n`\n\nfunction TriptychComponent({\n description,\n handlers,\n leftZone,\n title,\n className,\n}: TriptychProps): React.ReactElement<TriptychProps> {\n return (\n <TriptychView\n onClick={handlers?.onClick}\n onMouseEnter={handlers?.onMouseEnter}\n onMouseLeave={handlers?.onMouseLeave}\n onTouchStart={handlers?.onTouchStart}\n className={className}\n >\n {leftZone}\n <RightColumn centerSelf={!description}>\n {title}\n {description && <DescriptionInfo as=\"span\">{description}</DescriptionInfo>}\n </RightColumn>\n </TriptychView>\n )\n}\n\nexport const Triptych = styled(TriptychComponent)``\n", "import * as React from 'react'\nimport * as Redux from 'react-redux'\nimport styled from 'styled-components'\n\nimport * as plume from '@ulule/owl-kit-components/next'\n\nimport * as api from '@owl-nest/api-client/latest'\nimport { t } from '@owl-nest/localize'\nimport * as model from '@owl-nest/models'\nimport * as hooks from '@owl-nest/hooks'\nimport * as service from '@owl-nest/services'\nimport * as sharing from '@owl-nest/sharing'\nimport * as shadow from '@owl-nest/shadow'\n\nimport * as projectModel from '../../../../models/project'\nimport { RootState } from '../../../../../reducers'\nimport { FollowProjectButton } from '../FollowProjectButton'\nimport { TRACKING_SOURCE } from '../../utils/trackerEnums'\n\nexport function SocialActions() {\n const project = Redux.useSelector<RootState, projectModel.Project>((state) => state.application.project.data)\n const isFailure = model.project.isFinished<projectModel.ExtraFields>(project) && !project.goal_raised\n const [isProjectDetailShareModalOpen, setIsProjectDetailShareModalOpen] = hooks.useModal('ProjectDetailShare')\n\n const auth = service.user.useAuth()\n const tracking = shadow.useTracking()\n const projectURL = sharing.getSharingURL(\n 'project-page',\n 'clipboard',\n project,\n auth.type === 'loggedin' ? auth.user : undefined,\n )\n\n return (\n <>\n <SocialActionsView>\n <ActionButtonWrapper centeredButton={isFailure}>\n {project.status === api.ProjectStatus.ONLINE && !isFailure && (\n <plume.ActionButton\n onClick={async () => {\n if (navigator.share && plume.utils.isMobile()) {\n await navigator.share({\n title: model.project.name(project),\n url: projectURL,\n })\n tracking.social.track({\n eventCategory: shadow.CATEGORY.PROJECT_PAGE,\n eventLabel: TRACKING_SOURCE.HERO,\n socialAction: 'click: Share',\n socialNetwork: shadow.SOCIAL_NETWORK.NATIVE,\n socialTarget: project.absolute_url,\n })\n } else {\n setIsProjectDetailShareModalOpen(!isProjectDetailShareModalOpen)\n }\n }}\n active={isProjectDetailShareModalOpen}\n contents={{\n inactive: (\n <>\n <span>{t('Share')}</span> <plume.glyphs.stroke.Share size={17} />\n </>\n ),\n active: (\n <>\n <span>{t('Share')}</span> <plume.glyphs.stroke.Share size={17} />\n </>\n ),\n }}\n />\n )}\n <FollowProjectButton source={TRACKING_SOURCE.HERO} />\n </ActionButtonWrapper>\n </SocialActionsView>\n </>\n )\n}\n\nconst SocialActionsView = styled.div`\n margin-bottom: 25px;\n\n @media screen and ${plume.BREAKPOINTS.TABLET} {\n align-items: center;\n display: flex;\n justify-content: center;\n margin-bottom: 0;\n }\n`\n\nconst ActionButtonWrapper = styled.div<{ centeredButton: boolean }>`\n display: flex;\n justify-content: ${({ centeredButton }) => (centeredButton ? 'center' : 'space-between')};\n position: relative;\n\n ${plume.ActionButton} {\n margin-right: 10px;\n width: 100%;\n }\n\n @media screen and ${plume.BREAKPOINTS.TABLET} {\n ${plume.ActionButton} {\n margin-right: 10px;\n }\n }\n\n @media screen and ${plume.BREAKPOINTS.LAPTOP} {\n ${plume.ActionButton} {\n margin-left: 4px;\n margin-right: 4px;\n width: 130px;\n }\n }\n`\n", "import * as React from 'react'\nimport * as Redux from 'react-redux'\nimport styled from 'styled-components'\n\nimport * as model from '@owl-nest/models'\nimport * as shadow from '@owl-nest/shadow'\nimport * as plume from '@ulule/owl-kit-components/next'\n\nimport { Project } from '../../../../models/project'\nimport { RootState } from '../../../../../reducers'\nimport { useNavigation } from '../../../../hooks/useNavigation'\nimport { PATHS } from '../../../../paths'\n\nimport { SponsorshipTag } from '../SponsorshipTag'\n\ntype Sponsor = {\n avatar: string | undefined\n mode: string\n name: string\n ownerId: number\n tag: React.ReactNode | undefined\n}\n\ntype SponsorPropsType = {\n className?: string\n}\n\nfunction SponsorsComponent({ className }: SponsorPropsType): React.ReactElement<SponsorPropsType> {\n const project = Redux.useSelector<RootState, Project>((state) => state.application.project.data)\n\n const [indexActive, setIndexActive] = React.useState(0)\n const sponsors = (project.sponsorships || []).map((sponsorship) => {\n return {\n avatar: model.sponsorship.avatar(sponsorship, 'small'),\n mode: model.sponsorship.mode(sponsorship),\n name: sponsorship.sponsor.name,\n ownerId: sponsorship.sponsor.user.id,\n tag: <SponsorshipTag project={project} sponsorship={sponsorship} />,\n }\n })\n\n React.useEffect(() => {\n const timer = setTimeout(() => {\n const newIndex = indexActive >= sponsors.length - 1 ? 0 : indexActive + 1\n setIndexActive(newIndex)\n }, 5000)\n return () => clearTimeout(timer)\n }, [indexActive])\n\n return (\n <InfoCardWrapper className={className}>\n <InfoCard>\n {sponsors.map((sponsor, index) => (\n <AnimatedCard active={indexActive === index} key={index}>\n <Sponsor index={index} sponsor={sponsor} />\n </AnimatedCard>\n ))}\n </InfoCard>\n </InfoCardWrapper>\n )\n}\n\nexport const Sponsors = styled(SponsorsComponent)``\n\ntype SponsorProps = {\n index: number\n sponsor: Sponsor\n}\n\nexport function Sponsor({ index, sponsor }: SponsorProps): React.ReactElement<SponsorProps> {\n const project = Redux.useSelector<RootState, Project>((state) => state.application.project.data)\n const navigation = useNavigation()\n const sponsorRef = React.useRef(null)\n\n shadow.usePartnershipTracker(sponsor.ownerId, sponsorRef, {\n click: {\n enabled: true,\n },\n eventPosition: `sponsorship-banner-${index + 1}`,\n ignoreLocationChange: true,\n impression: {\n enabled: true,\n once: true,\n },\n })\n\n return (\n <SponsorWrapper ref={sponsorRef}>\n <plume.styles.copy.S>{sponsor.mode}</plume.styles.copy.S>\n <InfoCardItem\n onClick={() => {\n const path = document.location.pathname\n if (path !== project.absolute_url) {\n navigation.to(PATHS.PROJECT, {\n scrollTarget: 'sponsors',\n })\n } else {\n document.location.hash = 'sponsors'\n }\n }}\n >\n {sponsor.avatar && <plume.styles.image.Avatar src={sponsor.avatar} type=\"extra-small\" />}\n <InfoCardContent>\n <plume.styles.heading.XXXS>{sponsor.name}</plume.styles.heading.XXXS>\n {sponsor.tag}\n </InfoCardContent>\n </InfoCardItem>\n </SponsorWrapper>\n )\n}\n\nconst AnimatedCard = styled.div<{ active?: boolean }>`\n display: ${({ active }) => (active ? 'flex' : 'none')};\n opacity: ${({ active }) => (active ? '1' : '0')};\n z-index: ${({ active }) => (active ? '1' : '-1')};\n transition: 1s ease;\n top: 0;\n left: 0;\n`\n\nconst InfoCard = styled.div`\n position: relative;\n\n ${plume.styles.tag.Tag} {\n margin-top: 4px;\n\n @media screen and ${plume.BREAKPOINTS.LAPTOP} {\n margin-left: 10px;\n }\n }\n`\n\nconst InfoCardWrapper = styled.div`\n svg {\n color: ${plume.COLORS.PRIMARY_SAND_500};\n margin-right: 1px;\n }\n`\n\nconst SponsorWrapper = styled.div`\n align-items: center;\n display: flex;\n\n ${plume.styles.copy.S} {\n color: ${plume.COLORS.TEXT_SECONDARY};\n margin-right: 12px;\n }\n`\n\nconst InfoCardContent = styled.div`\n display: flex;\n flex-direction: column;\n\n @media screen and ${plume.BREAKPOINTS.TABLET} {\n right: 0;\n top: 20px;\n flex-direction: row;\n }\n`\n\nconst InfoCardItem = styled.div`\n display: flex;\n align-items: center;\n cursor: pointer;\n\n ${plume.styles.image.Avatar} {\n background-color: ${plume.COLORS.PRIMARY_GREY_000};\n margin-right: 12px;\n }\n`\n", "import * as React from 'react'\nimport * as Redux from 'react-redux'\nimport styled, { css } from 'styled-components'\n\nimport * as api from '@owl-nest/api-client/latest'\nimport { t } from '@owl-nest/localize'\nimport * as model from '@owl-nest/models'\nimport * as service from '@owl-nest/services'\nimport * as plume from '@ulule/owl-kit-components/next'\n\nimport * as UFE from '../../../../../UFE'\nimport * as projectModel from '../../../../models/project'\nimport { RootState } from '../../../../../reducers'\nimport { Share } from './Share'\nimport { ProjectFinanced } from './ProjectFinanced'\nimport { ProjectCancelled} from './ProjectCancelled'\nimport { ProjectFinancedOffboarding } from './ProjectFinancedOffboarding'\nimport { ProjectFinishedDonationBased } from './ProjectFinishedDonationBased'\nimport { ProjectNotFinanced } from './ProjectNotFinanced'\nimport { ContributionsBlock } from './ContributionsBlock'\nimport { DisplayMode } from '../../../../context'\n\nexport enum BlockStatus {\n SUCCESS_ACTIVE_ONBOARDING,\n SUCCESS_INACTIVE_ONBOARDING,\n FINISHED_DONATION_BASED,\n FINISHED_UNSUCCESSFULLY,\n CANCELLED,\n ONLINE,\n NONE,\n}\n\ntype BackersBlockPropTypes = {\n status: BlockStatus\n}\n\nexport function BackersBlock({ status }: BackersBlockPropTypes): React.ReactElement<BackersBlockPropTypes> {\n const [isOpen, setIsOpen] = React.useState(false)\n function toggle(): void {\n setIsOpen(!isOpen)\n }\n\n const project = Redux.useSelector<RootState, projectModel.Project>((state) => state.application.project.data)\n const auth = service.user.useAuth()\n const isUserSupporter = Number(project.user_orders?.length) > 0\n\n const displayMode = React.useContext(DisplayMode)\n const isEditMode = displayMode === 'edit'\n\n return (\n <Main isEditMode={isEditMode}>\n {status === BlockStatus.FINISHED_UNSUCCESSFULLY && isUserSupporter && (\n <Layout toggle={toggle} isOpen={isOpen} display={false}>\n <ProjectNotFinanced project={project} />\n </Layout>\n )}\n\n {status === BlockStatus.SUCCESS_ACTIVE_ONBOARDING && (\n <Layout toggle={toggle} isOpen={isOpen} display={isUserSupporter}>\n <ProjectFinancedOffboarding project={project} fullSize={!isUserSupporter} />\n {isUserSupporter && <ContributionsBlock isOpen={isOpen} project={project} />}\n </Layout>\n )}\n\n {status === BlockStatus.FINISHED_DONATION_BASED && (\n <Layout toggle={toggle} isOpen={isOpen} display={isUserSupporter}>\n <ProjectFinishedDonationBased project={project} fullSize={!isUserSupporter} />\n {isUserSupporter && <ContributionsBlock isOpen={isOpen} project={project} />}\n </Layout>\n )}\n\n {status === BlockStatus.SUCCESS_INACTIVE_ONBOARDING && (\n <Layout toggle={toggle} isOpen={isOpen} display={isUserSupporter}>\n <ProjectFinanced project={project} fullSize={!isUserSupporter} />\n {isUserSupporter && <ContributionsBlock isOpen={isOpen} project={project} />}\n </Layout>\n )}\n\n {status === BlockStatus.CANCELLED && (\n <Layout toggle={toggle} isOpen={isOpen} display={false}>\n <ProjectCancelled project={project} />\n </Layout>\n )}\n\n {status === BlockStatus.ONLINE && isUserSupporter && auth.type === 'loggedin' && (\n <>\n <Layout toggle={toggle} isOpen={isOpen} display={true}>\n <ContributionsBlock isOpen={isOpen} project={project} />\n {!plume.utils.isMobile() && <Share project={project} user={auth.user} />}\n </Layout>\n {plume.utils.isMobile() && <Share project={project} user={auth.user} />}\n </>\n )}\n </Main>\n )\n}\n\ntype LayoutProps = {\n isOpen: boolean\n toggle: () => void\n display: boolean\n children: React.ReactNode\n}\n\nfunction Layout({ isOpen, toggle, display, children }: LayoutProps): React.ReactElement<LayoutProps> {\n return (\n <Wrapper>\n <ContentContainer>{children}</ContentContainer>\n <ShowDetails isOpen={isOpen} display={display} onClick={toggle} asDesktop=\"XS\">\n {isOpen ? t('Close') : t('See details')}\n <plume.glyphs.stroke.CaretDown size={12} />\n </ShowDetails>\n </Wrapper>\n )\n}\n\nexport function useBlockStatus(): BlockStatus {\n const project = Redux.useSelector<RootState, projectModel.Project>((state) => state.application.project.data)\n\n const isProjectSuccess = model.project.success<projectModel.ExtraFields>(project)\n const isDonationBased = model.project.isDonationBased(project)\n const isFinished = model.project.isFinished<projectModel.ExtraFields>(project)\n const isCancelled = model.project.isCancelled<projectModel.ExtraFields>(project)\n const hasOnboarding = project.post_campaign_link !== undefined || project.boutique_link !== undefined\n\n if (isCancelled) {\n return BlockStatus.CANCELLED\n }\n\n if (isDonationBased && isFinished) {\n return BlockStatus.FINISHED_DONATION_BASED\n }\n\n if (isProjectSuccess && hasOnboarding) {\n return BlockStatus.SUCCESS_ACTIVE_ONBOARDING\n }\n\n if (isProjectSuccess && !hasOnboarding) {\n return BlockStatus.SUCCESS_INACTIVE_ONBOARDING\n }\n\n if (model.project.isFinished<projectModel.ExtraFields>(project) && !project.goal_raised) {\n return BlockStatus.FINISHED_UNSUCCESSFULLY\n }\n\n if (project.status === api.ProjectStatus.ONLINE) {\n return BlockStatus.ONLINE\n }\n\n return BlockStatus.NONE\n}\n\nconst Main = styled.div<{ isEditMode: boolean }>`\n @media screen and ${({ isEditMode }) => (isEditMode ? plume.BREAKPOINTS.LAPTOP_L : plume.BREAKPOINTS.LAPTOP)} {\n padding-top: 20px;\n }\n`\n\nconst Wrapper = styled.div`\n background-color: ${plume.COLORS.PRIMARY_GREY_000};\n max-width: 1200px;\n border-radius: 4px;\n box-sizing: border-box;\n\n @media screen and ${plume.BREAKPOINTS.LAPTOP} {\n box-shadow: ${plume.EFFECTS.SHADOW_5};\n margin: 20px auto 0px auto;\n background-image: url('${UFE.IMAGES.sparkles}');\n background-size: contain;\n padding: 16px 56px;\n }\n`\n\nconst ShowDetails = styled(plume.styles.copy.S)<{ isOpen: boolean; display: boolean }>`\n text-align: center;\n padding: 6px 0;\n display: ${(props) => (props.display ? 'block' : 'none')};\n\n ${plume.glyphs.stroke.CaretDown} {\n fill: ${plume.COLORS.PRIMARY_SAND_500};\n position: relative;\n margin-left: 5px;\n\n ${({ isOpen }) => {\n if (isOpen) {\n return css`\n top: 0;\n transform: rotateX(180deg);\n `\n }\n }}\n }\n\n @media screen and ${plume.BREAKPOINTS.LAPTOP} {\n display: none;\n }\n`\n\nconst ContentContainer = styled.div`\n display: block;\n justify-content: center;\n\n @media screen and ${plume.BREAKPOINTS.LAPTOP} {\n display: flex;\n }\n`\n", "import * as React from 'react'\nimport styled, { css } from 'styled-components'\n\nimport * as api from '@owl-nest/api-client/latest'\nimport { useCopy } from '@owl-nest/copier'\nimport { t } from '@owl-nest/localize'\nimport * as shadow from '@owl-nest/shadow'\nimport { getSharingURL, Platform, useSharing } from '@owl-nest/sharing'\nimport * as plume from '@ulule/owl-kit-components/next'\n\nimport * as projectModel from '../../../../models/project'\nimport { TRACKING_SOURCE } from '../../utils/trackerEnums'\n\ntype SharePropTypes = {\n project: projectModel.Project\n user: api.PublicUser\n}\n\nexport function Share({ project, user }: SharePropTypes): React.ReactElement<SharePropTypes> {\n const { canCopy, copy, copyStatus } = useCopy(3000)\n const tracking = shadow.useTracking()\n const { shareTo } = useSharing<projectModel.ExtraFields>('project-page', project, user)\n\n return (\n <SharesContainer>\n <InformationContainer>\n <plume.styles.heading.XXS asDesktop=\"S\">\n <plume.illustrations.twoToned.Share size={52} inverted noBackground />\n {t('Share to boost this project')}\n </plume.styles.heading.XXS>\n\n <Buttons>\n <Link onClick={share('facebook')}>\n <plume.glyphs.thirdParty.Facebook size={16} />\n </Link>\n <Link onClick={share('messenger')}>\n <plume.glyphs.thirdParty.Messenger size={16} />\n </Link>\n <Link onClick={share('twitter')}>\n <plume.glyphs.thirdParty.Twitter size={16} />\n </Link>\n <Link onClick={share('linkedin')}>\n <plume.glyphs.thirdParty.Linkedin size={16} />\n </Link>\n <Link onClick={share('whatsapp')}>\n <plume.glyphs.thirdParty.WhatsApp size={16} />\n </Link>\n {canCopy && copyStatus && (\n <plume.styles.tooltip.BlockAnchor>\n <plume.Tooltip fitToContent open={copyStatus !== 'idle'}>\n {copyStatus === 'succeeded' ? (\n <>\n <plume.glyphs.stroke.CheckCircle size={16} />\n <plume.styles.copy.S>{t('Link copied to your clipboard.')}</plume.styles.copy.S>\n </>\n ) : (\n <>\n <plume.glyphs.stroke.TimesCircle size={16} />\n <plume.styles.copy.S>\n {t(\"Sorry, we couldn't copy the link. Please try again!\")}\n </plume.styles.copy.S>\n </>\n )}\n </plume.Tooltip>\n\n <Link\n onClick={() => {\n const projectURL = getSharingURL<projectModel.ExtraFields>('project-page', 'clipboard', project, user)\n tracking.social.track({\n eventCategory: shadow.CATEGORY.PROJECT_PAGE,\n eventLabel: TRACKING_SOURCE.BACKERS,\n socialAction: 'click: Share',\n socialNetwork: shadow.SOCIAL_NETWORK.HYPERLINK,\n socialTarget: project.absolute_url,\n })\n copy(projectURL)\n }}\n >\n <plume.glyphs.thirdParty.WebsiteLink size={16} />\n </Link>\n </plume.styles.tooltip.BlockAnchor>\n )}\n </Buttons>\n </InformationContainer>\n </SharesContainer>\n )\n\n function share(plateform: Platform): () => void {\n return () => {\n shareTo(plateform, { eventCategory: shadow.CATEGORY.PROJECT_PAGE, eventLabel: TRACKING_SOURCE.BACKER_BLOCK })\n }\n }\n}\n\nconst SharesContainer = styled.div`\n display: block;\n margin-bottom: 14px;\n padding: 20px 20px 10px;\n text-align: center;\n\n @media screen and ${plume.BREAKPOINTS.LAPTOP} {\n display: flex;\n margin-bottom: 0px;\n padding: 0px;\n text-align: left;\n width: 100%;\n }\n`\n\nconst iconMargin = css`\n margin-right: 6px;\n margin-top: 2px;\n`\n\nconst InformationContainer = styled.div`\n box-sizing: border-box;\n padding: 0;\n width: 100%;\n\n ${plume.styles.heading.XXS} {\n display: block;\n margin-bottom: 15px;\n }\n\n ${plume.styles.tooltip.BlockAnchor} {\n display: inline-block;\n\n ${plume.glyphs.stroke.CheckCircle} {\n color: ${plume.COLORS.SECONDARY_GREEN_500};\n ${iconMargin};\n }\n\n ${plume.glyphs.stroke.TimesCircle} {\n color: ${plume.COLORS.PRIMARY_RED_500};\n ${iconMargin};\n }\n\n ${plume.Tooltip} {\n margin-bottom: 16px;\n }\n }\n\n // NOT SCREEN !\n @media not screen and ${plume.BREAKPOINTS.LAPTOP} {\n ${plume.styles.heading.XXS} {\n align-items: center;\n display: flex;\n flex-direction: column;\n justify-content: center;\n\n ${plume.illustrations.Illustration} {\n margin-bottom: 17px;\n }\n }\n }\n\n @media screen and ${plume.BREAKPOINTS.LAPTOP} {\n padding: 0px;\n\n ${plume.styles.heading.XXS} {\n text-align: center;\n\n ${plume.illustrations.Illustration} {\n margin-right: 17px;\n }\n }\n }\n`\n\nconst Link = styled.button`\n align-content: center;\n align-items: center;\n background-color: ${plume.COLORS.SECONDARY_GREEN_500};\n border: 0;\n cursor: pointer;\n display: inline-flex;\n height: 32px;\n justify-content: center;\n margin: 0 6px;\n padding: 0;\n width: 32px;\n\n ${plume.glyphs.Icon} {\n fill: ${plume.COLORS.PRIMARY_GREY_000};\n }\n`\n\nconst Buttons = styled.div`\n align-items: center;\n display: flex;\n justify-content: center;\n\n ${plume.styles.tooltip.BlockAnchor} {\n width: 32px;\n height: 32px;\n }\n`\n", "import * as React from 'react'\nimport styled, { css } from 'styled-components'\n\nimport { t } from '@owl-nest/localize'\nimport * as model from '@owl-nest/models'\nimport * as plume from '@ulule/owl-kit-components/next'\nimport * as env from '@owl-nest/config'\n\nimport * as projectModel from '../../../../models/project'\n\ntype ProjectFinancedPropTypes = {\n project: projectModel.Project\n fullSize: boolean\n}\n\nexport function ProjectFinanced({\n project,\n fullSize,\n}: ProjectFinancedPropTypes): React.ReactElement<ProjectFinancedPropTypes> {\n const userConfig = env.useUserEnv()\n\n return (\n <ProjectFinancedContainer fullSize={fullSize}>\n <InformationContainer fullSize={fullSize}>\n <plume.styles.heading.S asDesktop=\"L\">\n <plume.illustrations.twoToned.CrackedEgg size={60} noBackground inverted />\n\n {t('%(name)s got funded!', { name: model.user.username(project.owner) })}\n </plume.styles.heading.S>\n\n <plume.styles.copy.M>\n {t('Discover more %(mainTag)s live projects \uD83D\uDC47', {\n mainTag: model.project.mainTag<projectModel.ExtraFields>(project),\n })}\n </plume.styles.copy.M>\n\n <plume.styles.button.Button size=\"medium\" kind=\"primary\" as=\"a\" href={project.main_tag?.absolute_url}>\n {t(`See all %(category)s projects`, {\n category: project.main_tag?.name[userConfig.lang],\n })}\n </plume.styles.button.Button>\n </InformationContainer>\n </ProjectFinancedContainer>\n )\n}\n\nconst ProjectFinancedContainer = styled.div<{ fullSize: boolean }>`\n display: block;\n text-align: center;\n padding: 20px 0;\n width: 100%;\n\n // NOT SCREEN !\n @media not screen and ${plume.BREAKPOINTS.LAPTOP} {\n ${plume.illustrations.Illustration} {\n margin-bottom: 5px;\n }\n }\n\n @media screen and ${plume.BREAKPOINTS.LAPTOP} {\n display: flex;\n padding: 0;\n max-width: 790px;\n\n ${({ fullSize }) => {\n if (fullSize) {\n return css`\n justify-content: center;\n `\n } else {\n return css`\n text-align: left;\n `\n }\n }}\n }\n`\n\nconst InformationContainer = styled.div<{ fullSize: boolean }>`\n box-sizing: border-box;\n padding: 0 20px;\n width: 100%;\n\n ${({ fullSize }) => {\n if (fullSize) {\n return css`\n align-items: center;\n display: flex;\n flex-direction: column;\n `\n }\n }}\n\n ${plume.styles.heading.S} {\n align-items: center;\n display: flex;\n margin-bottom: 6px;\n }\n\n ${plume.styles.button.Button} {\n width: 100%;\n }\n\n ${plume.styles.copy.M} {\n margin-bottom: 20px;\n }\n\n // NOT SCREEN !\n @media not screen and ${plume.BREAKPOINTS.LAPTOP} {\n ${plume.styles.heading.S} {\n align-items: center;\n display: flex;\n flex-direction: column;\n justify-content: center;\n margin-bottom: 0px;\n }\n }\n\n @media screen and ${plume.BREAKPOINTS.LAPTOP} {\n ${plume.styles.heading.S} {\n ${plume.illustrations.Illustration} {\n margin-right: 8px;\n }\n }\n\n ${plume.styles.button.Button} {\n width: auto;\n }\n }\n`\n", "import * as React from 'react'\nimport styled from 'styled-components'\n\nimport { t } from '@owl-nest/localize'\nimport * as model from '@owl-nest/models'\nimport * as plume from '@ulule/owl-kit-components/next'\n\nimport * as projectModel from '../../../../models/project'\n\ntype ProjectCancelledPropTypes = {\n project: projectModel.Project\n}\n\nexport function ProjectCancelled({ project }: ProjectCancelledPropTypes): React.ReactElement<ProjectCancelledPropTypes> {\n return (\n <ProjectCancelledContainer>\n <plume.styles.heading.L>\n {t('Project %(name)s has archived.', { name: model.project.name<projectModel.ExtraFields>(project) })}\n </plume.styles.heading.L>\n\n <plume.styles.copy.M>\n {t('This project has been taken offline at the request of the creator. You can contact him via his profile:')}\n </plume.styles.copy.M>\n\n <Avatar href={project.owner.absolute_url}>\n <plume.styles.image.Avatar src={model.user.avatar(project.owner, '180x180')} />\n <plume.styles.heading.XXXS>{model.user.username(project.owner)}</plume.styles.heading.XXXS>\n </Avatar>\n </ProjectCancelledContainer>\n )\n}\n\nconst ProjectCancelledContainer = styled.div`\n display: block;\n text-align: center;\n padding: 20px 0;\n\n ${plume.styles.heading.L} {\n margin-bottom: 20px;\n }\n\n ${plume.styles.copy.M} {\n margin-bottom: 20px;\n }\n\n @media screen and ${plume.BREAKPOINTS.LAPTOP} {\n width: 100%;\n padding: 0;\n }\n`\n\nconst Avatar = styled.a`\n ${plume.styles.heading.XXXS},\n ${plume.styles.image.Avatar} {\n display: inline-block;\n vertical-align: middle;\n }\n text-decoration: none;\n\n ${plume.styles.image.Avatar} {\n margin-right: 8px;\n }\n`\n", "import * as React from 'react'\nimport styled, { css } from 'styled-components'\n\nimport { t } from '@owl-nest/localize'\nimport * as model from '@owl-nest/models'\nimport { CATEGORY, EVENT_TYPE, useTracking } from '@owl-nest/shadow'\nimport * as utils from '@owl-nest/utils'\n\nimport * as plume from '@ulule/owl-kit-components/next'\n\nimport * as projectModel from '../../../../models/project'\nimport { TRACKING_ACTION, TRACKING_SOURCE } from '../../utils/trackerEnums'\n\ntype ProjectFinancedOffboardingProps = {\n project: projectModel.Project\n fullSize: boolean\n}\n\nexport function ProjectFinancedOffboarding({\n project,\n fullSize,\n}: ProjectFinancedOffboardingProps): React.ReactElement<ProjectFinancedOffboardingProps> {\n const offboardingType: string | undefined = project.onboarding_steps?.offboarding?.type\n\n const tracking = useTracking()\n\n const boutiqueLink = project.boutique_link?.url\n const postCampaignUrl = project.post_campaign_link?.url\n\n let button = t('Order')\n if (boutiqueLink) {\n button = t('Buy %(brand)s on Ulule Boutique', { brand: model.user.username(project.owner) })\n } else if (offboardingType === 'support') {\n button = t('Back the project')\n } else if (offboardingType === 'follow') {\n button = t('Follow the project')\n }\n\n return (\n <ProjectFinancedContainer fullSize={fullSize}>\n <InformationContainer fullSize={fullSize}>\n <plume.styles.heading.S asDesktop=\"L\">\n <plume.illustrations.twoToned.CrackedEgg size={60} noBackground inverted />\n {t('%(name)s got funded!', { name: model.user.username(project.owner) })}\n </plume.styles.heading.S>\n\n <plume.styles.copy.M>\n {boutiqueLink ? t('Find this project on the Boutique \uD83D\uDC47') : t('Good news, we have continued selling here \uD83D\uDC47')}\n </plume.styles.copy.M>\n\n <plume.styles.copy.M>\n <plume.styles.button.Button\n size=\"medium\"\n kind=\"primary\"\n as=\"a\"\n href={\n boutiqueLink\n ? utils.searchParams.addSearchParamsToUrl(boutiqueLink, {\n utm_source: 'page-collecte',\n utm_medium: 'CTA',\n utm_campaign: 'page-collecte-vendeur',\n })\n : postCampaignUrl\n }\n onClick={track}\n >\n {button}\n </plume.styles.button.Button>\n </plume.styles.copy.M>\n\n {postCampaignUrl && boutiqueLink && (\n <ShopCTA>\n <plume.Link tinted darkened uppercase href={postCampaignUrl} target=\"_blank\" rel=\"noopener noreferrer\">\n {t('Buy on the official website')}\n <plume.glyphs.stroke.ArrowRight size={18} />\n </plume.Link>\n </ShopCTA>\n )}\n </InformationContainer>\n </ProjectFinancedContainer>\n )\n\n function track() {\n if (offboardingType !== undefined) {\n tracking.track({\n event: EVENT_TYPE.GENERIC,\n eventCategory: CATEGORY.PROJECT_PAGE,\n eventAction: TRACKING_ACTION.CLICK_OFFBOARDING,\n eventLabel: TRACKING_SOURCE.BACKER_BLOCK,\n eventValue: offboardingType,\n })\n }\n }\n}\n\nconst ProjectFinancedContainer = styled.div<{ fullSize: boolean }>`\n display: block;\n text-align: center;\n padding: 20px 0px;\n width: 100%;\n\n // NOT SCREEN !\n @media not screen and ${plume.BREAKPOINTS.LAPTOP} {\n ${plume.illustrations.Illustration} {\n margin-bottom: 5px;\n }\n }\n\n @media screen and ${plume.BREAKPOINTS.LAPTOP} {\n display: flex;\n padding: 0;\n max-width: 790px;\n\n ${({ fullSize }) => {\n if (fullSize) {\n return css`\n justify-content: center;\n `\n } else {\n return css`\n text-align: left;\n `\n }\n }}\n }\n`\n\nconst InformationContainer = styled.div<{ fullSize: boolean }>`\n box-sizing: border-box;\n padding: 0 20px;\n width: 100%;\n\n ${({ fullSize }) => {\n if (fullSize) {\n return css`\n align-items: center;\n display: flex;\n flex-direction: column;\n `\n }\n }}\n\n ${plume.styles.heading.S} {\n align-items: center;\n display: flex;\n margin-bottom: 6px;\n }\n\n ${plume.styles.button.Button} {\n width: 100%;\n }\n\n ${plume.Link} {\n margin-top: 20px;\n }\n\n ${plume.styles.copy.M} {\n margin-bottom: 16px;\n }\n\n // NOT SCREEN !\n @media not screen and ${plume.BREAKPOINTS.LAPTOP} {\n ${plume.styles.heading.S} {\n align-items: center;\n display: flex;\n flex-direction: column;\n justify-content: center;\n margin-bottom: 0px;\n }\n }\n\n @media screen and ${plume.BREAKPOINTS.LAPTOP} {\n ${plume.styles.heading.S} {\n ${plume.illustrations.Illustration} {\n margin-right: 8px;\n }\n }\n\n ${plume.styles.button.Button} {\n width: auto;\n }\n }\n`\n\nconst ShopCTA = styled(plume.styles.copy.M)`\n text-align: center;\n\n ${plume.glyphs.stroke.ArrowRight} {\n margin-left: 11px;\n margin-top: -6px;\n transition: margin-left 0.3s cubic-bezier(0.83, 0, 0.17, 1);\n }\n\n ${plume.Link} {\n &:hover {\n ${plume.glyphs.stroke.ArrowRight} {\n margin-left: 18px;\n }\n }\n }\n\n @media screen and ${plume.BREAKPOINTS.LAPTOP} {\n text-align: left;\n }\n`\n", "import * as React from 'react'\nimport styled, { css } from 'styled-components'\n\nimport { t } from '@owl-nest/localize'\nimport * as model from '@owl-nest/models'\nimport { CATEGORY, EVENT_TYPE, useTracking } from '@owl-nest/shadow'\nimport * as utils from '@owl-nest/utils'\nimport * as env from '@owl-nest/config'\n\nimport * as plume from '@ulule/owl-kit-components/next'\n\nimport * as projectModel from '../../../../models/project'\nimport { TRACKING_ACTION, TRACKING_SOURCE } from '../../utils/trackerEnums'\n\ntype ProjectFinishedDonationBasedProps = {\n project: projectModel.Project\n fullSize: boolean\n}\n\nexport function ProjectFinishedDonationBased({\n project,\n fullSize,\n}: ProjectFinishedDonationBasedProps): React.ReactElement<ProjectFinishedDonationBasedProps> {\n const offboardingType: string | undefined = project.onboarding_steps?.offboarding?.type\n\n const tracking = useTracking()\n const userConfig = env.useUserEnv()\n\n const boutiqueLink = project.boutique_link?.url\n const postCampaignUrl = project.post_campaign_link?.url\n const hasOnboarding = boutiqueLink !== undefined || postCampaignUrl !== undefined\n\n let button = t('Order')\n if (boutiqueLink) {\n button = t('Buy %(brand)s on Ulule Boutique', { brand: model.user.username(project.owner) })\n } else if (offboardingType === 'support') {\n button = t('Back the project')\n } else if (offboardingType === 'follow') {\n button = t('Follow the project')\n }\n\n return (\n <ProjectFinishedDonationBasedContainer fullSize={fullSize}>\n <InformationContainer fullSize={fullSize}>\n <plume.styles.heading.S asDesktop=\"L\">\n <plume.illustrations.twoToned.CrackedEgg size={60} noBackground inverted />\n {t(`%(name)s's project is finished!`, { name: model.user.username(project.owner) })}\n </plume.styles.heading.S>\n\n {hasOnboarding ? (\n <>\n <plume.styles.copy.M>\n {boutiqueLink\n ? t('Find this project on the Boutique \uD83D\uDC47')\n : t('Good news, we have continued selling here \uD83D\uDC47')}\n </plume.styles.copy.M>\n <plume.styles.copy.M>\n <plume.styles.button.Button\n size=\"medium\"\n kind=\"primary\"\n as=\"a\"\n href={\n boutiqueLink\n ? utils.searchParams.addSearchParamsToUrl(boutiqueLink, {\n utm_source: 'page-collecte',\n utm_medium: 'CTA',\n utm_campaign: 'page-collecte-vendeur',\n })\n : postCampaignUrl\n }\n onClick={track}\n >\n {button}\n </plume.styles.button.Button>\n </plume.styles.copy.M>\n {postCampaignUrl && boutiqueLink && (\n <ShopCTA>\n <plume.Link tinted uppercase href={postCampaignUrl} target=\"_blank\" rel=\"noopener noreferrer\">\n {t('Buy on the official website')}\n <plume.glyphs.stroke.ArrowRight size={18} />\n </plume.Link>\n </ShopCTA>\n )}\n </>\n ) : (\n <>\n <plume.styles.copy.M>\n {t('Discover more %(mainTag)s live projects \uD83D\uDC47', {\n mainTag: model.project.mainTag<projectModel.ExtraFields>(project),\n })}\n </plume.styles.copy.M>\n\n <plume.styles.button.Button size=\"medium\" kind=\"primary\" as=\"a\" href={project.main_tag?.absolute_url}>\n {t(`See all %(category)s projects`, {\n category: project.main_tag?.name[userConfig.lang],\n })}\n </plume.styles.button.Button>\n </>\n )}\n </InformationContainer>\n </ProjectFinishedDonationBasedContainer>\n )\n\n function track() {\n if (offboardingType !== undefined) {\n tracking.track({\n event: EVENT_TYPE.GENERIC,\n eventCategory: CATEGORY.PROJECT_PAGE,\n eventAction: TRACKING_ACTION.CLICK_OFFBOARDING,\n eventLabel: TRACKING_SOURCE.BACKER_BLOCK,\n eventValue: offboardingType,\n })\n }\n }\n}\n\nconst ProjectFinishedDonationBasedContainer = styled.div<{ fullSize: boolean }>`\n display: block;\n text-align: center;\n padding: 20px 0px;\n width: 100%;\n\n // NOT SCREEN !\n @media not screen and ${plume.BREAKPOINTS.LAPTOP} {\n ${plume.illustrations.Illustration} {\n margin-bottom: 5px;\n }\n }\n\n @media screen and ${plume.BREAKPOINTS.LAPTOP} {\n display: flex;\n padding: 0;\n max-width: 790px;\n\n ${({ fullSize }) => {\n if (fullSize) {\n return css`\n justify-content: center;\n `\n } else {\n return css`\n text-align: left;\n `\n }\n }}\n }\n`\n\nconst InformationContainer = styled.div<{ fullSize: boolean }>`\n box-sizing: border-box;\n padding: 0 20px;\n width: 100%;\n\n ${({ fullSize }) => {\n if (fullSize) {\n return css`\n align-items: center;\n display: flex;\n flex-direction: column;\n `\n }\n }}\n\n ${plume.styles.heading.S} {\n align-items: center;\n display: flex;\n margin-bottom: 6px;\n }\n\n ${plume.styles.button.Button} {\n width: 100%;\n }\n\n ${plume.Link} {\n margin-top: 20px;\n }\n\n ${plume.styles.copy.M} {\n margin-bottom: 16px;\n }\n\n // NOT SCREEN !\n @media not screen and ${plume.BREAKPOINTS.LAPTOP} {\n ${plume.styles.heading.S} {\n align-items: center;\n display: flex;\n flex-direction: column;\n justify-content: center;\n margin-bottom: 0px;\n }\n }\n\n @media screen and ${plume.BREAKPOINTS.LAPTOP} {\n ${plume.styles.heading.S} {\n ${plume.illustrations.Illustration} {\n margin-right: 8px;\n }\n }\n\n ${plume.styles.button.Button} {\n width: auto;\n }\n }\n`\n\nconst ShopCTA = styled(plume.styles.copy.M)`\n text-align: center;\n\n ${plume.glyphs.stroke.ArrowRight} {\n margin-left: 11px;\n margin-top: -6px;\n transition: margin-left 0.3s cubic-bezier(0.83, 0, 0.17, 1);\n }\n\n ${plume.Link} {\n &:hover {\n ${plume.glyphs.stroke.ArrowRight} {\n margin-left: 18px;\n }\n }\n }\n\n @media screen and ${plume.BREAKPOINTS.LAPTOP} {\n text-align: left;\n }\n`\n", "import * as React from 'react'\nimport styled from 'styled-components'\n\nimport { t } from '@owl-nest/localize'\nimport * as plume from '@ulule/owl-kit-components/next'\n\nimport * as projectModel from '../../../../models/project'\n\ntype ProjectNotFinancedPropTypes = {\n project: projectModel.Project\n}\n\nexport function ProjectNotFinanced({\n project,\n}: ProjectNotFinancedPropTypes): React.ReactElement<ProjectNotFinancedPropTypes> {\n return (\n <ProjectNotFinancedContainer>\n <InformationContainer>\n <plume.styles.heading.XXS asDesktop=\"S\">\n <plume.illustrations.twoToned.HeartWithConfetti size={60} noBackground inverted />\n {t('Thanks for believing in this project!')}\n </plume.styles.heading.XXS>\n\n <plume.styles.copy.M>\n {t('Despite your support, this project did not reach its goal. Your contribution has been fully refunded.')}\n </plume.styles.copy.M>\n </InformationContainer>\n\n <plume.styles.button.Button\n size=\"small\"\n kind=\"secondary\"\n as=\"a\"\n href={`/discussions/compose/${project.owner.id}`}\n >\n {t('Message the project creator')}\n </plume.styles.button.Button>\n </ProjectNotFinancedContainer>\n )\n}\n\nconst ProjectNotFinancedContainer = styled.div`\n box-sizing: border-box;\n display: block;\n margin: 0 auto;\n max-width: 840px;\n padding: 20px;\n text-align: center;\n width: 100%;\n\n ${plume.styles.button.Button} {\n flex: none;\n flex-grow: 1;\n width: 100%;\n }\n\n // NOT SCREEN !\n @media not screen and ${plume.BREAKPOINTS.LAPTOP} {\n ${plume.illustrations.Illustration} {\n margin-bottom: 5px;\n }\n }\n\n @media screen and ${plume.BREAKPOINTS.LAPTOP} {\n align-content: center;\n align-items: center;\n display: flex;\n padding: 25px 0;\n text-align: left;\n\n ${plume.styles.button.Button} {\n width: auto;\n }\n }\n`\n\nconst InformationContainer = styled.div`\n box-sizing: border-box;\n padding: 0 20px;\n width: 100%;\n\n ${plume.styles.heading.XXS} {\n display: block;\n }\n\n ${plume.styles.copy.M} {\n margin-bottom: 10px;\n }\n\n // NOT SCREEN !\n @media not screen and ${plume.BREAKPOINTS.LAPTOP} {\n ${plume.styles.heading.XXS} {\n align-items: center;\n display: flex;\n flex-direction: column;\n justify-content: center;\n margin-bottom: 0px;\n }\n }\n\n @media screen and ${plume.BREAKPOINTS.LAPTOP} {\n padding: 0;\n\n ${plume.styles.heading.XXS} {\n margin-bottom: 16px;\n margin: 0 auto 6px;\n\n ${plume.illustrations.Illustration} {\n margin-right: 8px;\n }\n }\n\n ${plume.styles.copy.M} {\n margin-bottom: 0;\n }\n }\n`\n", "import * as React from 'react'\nimport styled from 'styled-components'\n\nimport { t } from '@owl-nest/localize'\nimport { useAuth } from '@owl-nest/redux-wrapper/hooks'\nimport * as plume from '@ulule/owl-kit-components/next'\n\nimport * as projectModel from '../../../../models/project'\n\nimport { Contribution } from './Contribution'\n\ntype ContributionsBlockProp = {\n project: projectModel.Project\n isOpen: boolean\n}\n\nexport function ContributionsBlock({\n project,\n isOpen,\n}: ContributionsBlockProp): React.ReactElement<ContributionsBlockProp> {\n const orders = project.user_orders || []\n const auth = useAuth()\n const userId = auth.type === 'loggedin' ? auth.user.id : undefined\n\n return (\n <ContributionsContainer>\n <InformationContainer>\n <plume.styles.heading.XXS asDesktop=\"S\">\n <plume.illustrations.twoToned.HeartWithConfetti size={60} inverted noBackground />\n {t('Thanks for backing this project!')}\n </plume.styles.heading.XXS>\n\n <ResponsiveWrapper isOpen={isOpen}>\n {orders.length > 2 ? (\n <>\n <ShrinkContributions>\n {orders.map((order, i) => (\n <Contribution key={i} project={project} order={order} />\n ))}\n </ShrinkContributions>\n\n <ShowContributions>\n {userId && (\n <plume.Link\n kind=\"inverted\"\n underlined\n href={`/users/${userId}/transactions/?project_id=${project.id}`}\n >\n {t('See all my contributions to this project')}\n </plume.Link>\n )}\n </ShowContributions>\n </>\n ) : (\n <>\n {orders.map((order, i) => (\n <Contribution key={i} project={project} order={order} />\n ))}\n </>\n )}\n\n <LinkContainer>\n <plume.Link href={`/${project.slug}/news/`} kind={'secondary'}>\n {t('See posts')}\n </plume.Link>\n\n <plume.Link href={`/discussions/compose/${project.owner.id}?order-id=${orders[0].id}`} kind={'secondary'}>\n {t('Contact creator')}\n </plume.Link>\n </LinkContainer>\n </ResponsiveWrapper>\n </InformationContainer>\n </ContributionsContainer>\n )\n}\n\nconst ContributionsContainer = styled.div`\n display: block;\n text-align: center;\n padding: 10px 0 0;\n width: 100%;\n\n @media screen and ${plume.BREAKPOINTS.LAPTOP} {\n display: flex;\n text-align: left;\n padding: 0px;\n }\n\n // NOT SCREEN !\n @media not screen and ${plume.BREAKPOINTS.LAPTOP} {\n ${plume.illustrations.Illustration} {\n margin-bottom: 5px;\n }\n }\n`\n\nconst InformationContainer = styled.div`\n padding: 0;\n width: 100%;\n box-sizing: border-box;\n\n ${plume.styles.heading.XXS} {\n display: block;\n margin: 4px auto 22px;\n }\n\n // NOT SCREEN !\n @media not screen and ${plume.BREAKPOINTS.LAPTOP} {\n ${plume.styles.heading.XXS} {\n align-items: center;\n display: flex;\n flex-direction: column;\n justify-content: center;\n margin-bottom: 0px;\n }\n }\n\n @media screen and ${plume.BREAKPOINTS.LAPTOP} {\n padding: 0 20px;\n\n ${plume.styles.heading.XXS} {\n margin-bottom: 16px;\n margin: 0 auto 6px;\n\n ${plume.illustrations.Illustration} {\n margin-right: 8px;\n }\n }\n }\n`\n\nconst LinkContainer = styled(plume.styles.copy.S)`\n margin-left: 8px;\n margin-top: 10px;\n text-align: center;\n\n ${plume.Link} + ${plume.Link} {\n margin-left: 20px;\n }\n\n @media screen and ${plume.BREAKPOINTS.LAPTOP} {\n text-align: left;\n margin-left: 0;\n }\n`\n\nconst ShrinkContributions = styled.div`\n max-height: 180px;\n overflow: hidden;\n position: relative;\n z-index: 0;\n\n &::after {\n content: '';\n position: absolute;\n bottom: 0;\n left: 0;\n width: 100%;\n height: 30%;\n z-index: 10;\n background: linear-gradient(\n 180deg,\n ${plume.COLORS.hexToRgb(plume.COLORS.PRIMARY_GREY_000, 0.1)} 0%,\n ${plume.COLORS.hexToRgb(plume.COLORS.PRIMARY_GREY_000, 1)} 80%\n );\n }\n\n @media screen and ${plume.BREAKPOINTS.LAPTOP} {\n margin-top: 0;\n }\n`\n\nconst ShowContributions = styled(plume.styles.copy.S)`\n display: block;\n text-align: center;\n position: relative;\n margin-top: -20px;\n\n ${plume.Link} {\n color: ${plume.COLORS.TEXT_SECONDARY};\n }\n`\n\nconst ResponsiveWrapper = styled.div<{ isOpen: boolean }>`\n // NOT SCREEN !\n @media not screen and ${plume.BREAKPOINTS.LAPTOP} {\n margin-top: ${(props) => (props.isOpen ? '20px' : '0')};\n display: ${(props) => (props.isOpen ? 'block' : 'none')};\n }\n`\n", "import * as React from 'react'\nimport styled, { css } from 'styled-components'\n\nimport * as api from '@owl-nest/api-client/latest'\nimport * as dateutils from '@owl-nest/date'\nimport { t, tc, tn } from '@owl-nest/localize'\nimport * as model from '@owl-nest/models'\nimport { MoneyDisplayer } from '@owl-nest/money'\nimport * as plume from '@ulule/owl-kit-components/next'\n\nimport * as projectModel from '../../../../models/project'\n\nimport { RewardList } from './RewardList'\n\nenum OrderStatus {\n VALID,\n CANCELLED,\n NEED_RENEW,\n FAILED,\n}\n\ntype ContributionProps = {\n project: projectModel.Project\n order: api.Order\n}\n\nexport function Contribution({ project, order }: ContributionProps): React.ReactElement<ContributionProps> {\n if (model.project.isDonationBased(project)) {\n return <Donation project={project} order={order} />\n }\n\n const status = orderStatus(order)\n const deliveryType = order.shipping_type\n\n const renewCopy =\n order.payment_method === api.PaymentMethod.PAYPAL\n ? t('Confirm your Paypal payment')\n : t('Confirm your payment details')\n\n const skuList = order.items\n ? order.items\n .map((orderItem) => model.sku.Sku<projectModel.ExtraFields>(orderItem, project))\n .filter((sku): sku is model.sku.Sku<projectModel.ExtraFields> => sku !== undefined)\n : []\n const isMonoReward = skuList.length === 1 && order.tip === 0\n const isTipOnly = skuList.length === 0 && order.tip !== 0\n const areSomeRewardLegacy = skuList.some((sku) => {\n if (sku.type === 'reward') {\n return model.reward.isLegacy(sku.item)\n }\n return model.reward.isLegacy(sku.item.parent)\n })\n\n const displayDetail = !isMonoReward && !areSomeRewardLegacy && !isTipOnly\n\n return (\n <>\n <ContributionBlock>\n <RewardInformations href={!displayDetail ? order.edit_url : undefined}>\n <RewardBlock>\n <RewardPrice status={status}>\n <MoneyDisplayer amount={order.order_total} project={project} />\n </RewardPrice>\n\n <RewardList\n title={title(order, skuList)}\n subtitle={subtitle(skuList)}\n skuList={skuList}\n displayDetail={displayDetail}\n />\n </RewardBlock>\n\n <plume.styles.copy.XS>\n {deliveryType === api.OrderShippingType.USER_ADDRESS &&\n tc('Home delivery [delivery]', {\n delivery: <strong dangerouslySetInnerHTML={{ __html: formattedDeliveryDate(skuList) }} />,\n })}\n {deliveryType === api.OrderShippingType.PICKUP_POINT &&\n tc('Pickup point [delivery]', {\n delivery: <strong dangerouslySetInnerHTML={{ __html: formattedDeliveryDate(skuList) }} />,\n })}\n {deliveryType === api.OrderShippingType.MONDIAL_RELAY &&\n tc('Mondial Relay delivery [delivery]', {\n delivery: <strong dangerouslySetInnerHTML={{ __html: formattedDeliveryDate(skuList) }} />,\n })}\n </plume.styles.copy.XS>\n {/* TODO: get info from api to know if payment was canceled or never happened */}\n {/*footerNotes && <S.copy.XS>{footerNotes}</S.copy.XS>*/}\n </RewardInformations>\n\n {order.edit_url && (\n <LinkToContribution href={order.edit_url} kind=\"inverted\">\n <plume.styles.copy.XS>{t('See details')}</plume.styles.copy.XS>\n <plume.glyphs.stroke.ArrowRight size={12} />\n </LinkToContribution>\n )}\n </ContributionBlock>\n\n {status === OrderStatus.NEED_RENEW && order.renew_url && (\n <plume.Callout type=\"alert\">\n <plume.Link href={order.renew_url}>{renewCopy}</plume.Link>\n </plume.Callout>\n )}\n </>\n )\n}\n\nfunction Donation({ project, order }: ContributionProps) {\n const status = orderStatus(order)\n const isFinishedAndRecurrent = model.project.isFinished(project) && order.subscription !== undefined\n\n const renewCopy =\n order.payment_method === api.PaymentMethod.PAYPAL\n ? t('Confirm your Paypal payment')\n : t('Confirm your payment details')\n\n return (\n <>\n <ContributionBlock>\n <RewardInformations>\n <RewardBlock>\n <RewardPrice status={status} isFinishedAndRecurrent={isFinishedAndRecurrent}>\n <MoneyDisplayer amount={order.order_total} project={project} />\n </RewardPrice>{' '}\n {order.subscription && <Frequency>{t('per month')}</Frequency>}\n </RewardBlock>\n\n <plume.styles.copy.XS>\n {status === OrderStatus.CANCELLED &&\n !isFinishedAndRecurrent &&\n t('Last payment made on %(date)s', {\n date: dateutils.format(new Date(order.created_at), 'dd/MM/yyyy'),\n })}\n {status === OrderStatus.VALID &&\n !isFinishedAndRecurrent &&\n order.subscription?.next_payment_expected_at &&\n t('Next payment on %(date)s', {\n date: dateutils.format(\n // HACK: next_payment_expected_at has no time information. For\n // a canadian user (GMT -5), parsing this date will give a\n // Date for the day before. Adding time info fixes the issue.\n new Date(`${order.subscription.next_payment_expected_at}T00:00:00`),\n 'dd/MM/yyyy',\n ),\n })}\n {status === OrderStatus.VALID &&\n !isFinishedAndRecurrent &&\n order.subscription === undefined &&\n t('Payment made on %(date)s', {\n date: dateutils.format(new Date(order.created_at), 'dd/MM/yyyy'),\n })}\n {isFinishedAndRecurrent && t('No upcoming payments')}\n </plume.styles.copy.XS>\n </RewardInformations>\n\n {order.edit_url && (\n <LinkToContribution href={order.edit_url} kind=\"inverted\">\n <plume.styles.copy.XS>{t('See details')}</plume.styles.copy.XS>\n <plume.glyphs.stroke.ArrowRight size={12} />\n </LinkToContribution>\n )}\n </ContributionBlock>\n\n {(status === OrderStatus.FAILED || status === OrderStatus.NEED_RENEW) && order.renew_url && (\n <plume.Callout type=\"alert\">\n <plume.Link href={order.renew_url}>{renewCopy}</plume.Link>\n </plume.Callout>\n )}\n </>\n )\n}\n\nfunction orderStatus(order: api.Order): OrderStatus {\n if (\n order.status === 'cancelled' ||\n order.status === 'payment-reimbursed' ||\n order?.subscription?.status === api.SubscriptionStatus.CANCELED\n ) {\n return OrderStatus.CANCELLED\n } else if (order.status === 'payment-invalid') {\n return OrderStatus.NEED_RENEW\n } else if (order.subscription?.status === api.SubscriptionStatus.FAILED) {\n return OrderStatus.FAILED\n }\n return OrderStatus.VALID\n}\n\nfunction title(order: api.Order, skuList: model.sku.Sku<projectModel.ExtraFields>[]): string {\n const quantity = skuList.map((item) => item.quantity).reduce((a, b) => a + b, 0)\n\n if (order.tip > 0) {\n let title = t('Free donation')\n if (quantity > 0) {\n title = `${title} + ${tn('%d reward', '%d rewards', quantity)}`\n }\n return title\n }\n\n const firstSkuItem = skuList[0]\n\n // HACK: For old free donation contributions with no tip and no reward\n // Can be deleted when all old orders are migrated\n if (!firstSkuItem && order.tip === 0) return t('Free donation')\n\n if (skuList.length > 1 || (firstSkuItem && model.sku.isLegacy(firstSkuItem))) {\n return tn('%d reward', '%d rewards', quantity)\n }\n\n const title = model.sku.title(firstSkuItem)\n if (firstSkuItem.quantity > 1 && title !== undefined) {\n return t('%(quantity)dx %(title)s', { quantity, title })\n }\n\n return title || ''\n}\n\nfunction subtitle(skuList: model.sku.Sku<projectModel.ExtraFields>[]): string | undefined {\n if (skuList.length === 1 && skuList[0].type === 'variant') {\n return model.variant.description(skuList[0].item)\n }\n}\n\nfunction deduplicateAndSortByDeliveryDate(\n rewards: model.reward.Reward<projectModel.ExtraFields>[],\n): model.reward.Reward<projectModel.ExtraFields>[] {\n const seen: { [s: string]: boolean } = {}\n const deduplicated: model.reward.Reward<projectModel.ExtraFields>[] = []\n\n for (const reward of rewards) {\n const date = reward.shippings?.date_delivery || ''\n\n if (!(date in seen)) {\n seen[date] = true\n deduplicated.push(reward)\n }\n }\n\n deduplicated.sort((a, b) => {\n const dateA = a.shippings?.date_delivery\n const dateB = b.shippings?.date_delivery\n if (!dateA && !dateB) {\n return 0\n }\n if (!dateA) {\n return 1\n }\n if (!dateB) {\n return -1\n }\n return dateutils.compareAsc(new Date(dateA), new Date(dateB))\n })\n\n return deduplicated\n}\n\nfunction formattedDeliveryDate(skuList: model.sku.Sku<projectModel.ExtraFields>[]): string {\n const rewardsDeduplicatedAndSortedByDeliveryDate = deduplicateAndSortByDeliveryDate(\n skuList.map((sku) => model.sku.getReward(sku)),\n )\n\n if (rewardsDeduplicatedAndSortedByDeliveryDate.length === 1) {\n return model.reward.formattedDeliveryDate(rewardsDeduplicatedAndSortedByDeliveryDate[0], 'MMMM yyyy')\n } else if (rewardsDeduplicatedAndSortedByDeliveryDate.length > 1) {\n return t('As of %(date)s', {\n date: model.reward.formattedDeliveryDate(rewardsDeduplicatedAndSortedByDeliveryDate[0], 'MMMM yyyy'),\n })\n }\n\n return ''\n}\n\nconst Frequency = styled(plume.styles.heading.XXXS)`\n margin-left: 8px;\n color: ${plume.COLORS.TEXT_PRIMARY};\n`\n\nconst ContributionBlock = styled.div`\n align-items: stretch;\n display: flex;\n position: relative;\n\n ${plume.styles.copy.XS} {\n color: ${plume.COLORS.TEXT_PRIMARY};\n }\n\n &:nth-child(2) {\n margin-top: 10px;\n }\n\n & + & {\n margin-top: 4px;\n }\n\n @media screen and ${plume.BREAKPOINTS.LAPTOP} {\n &:nth-child(2) {\n margin-top: 4px;\n }\n }\n`\n\nconst RewardInformations = styled.a`\n background-color: ${plume.COLORS.BACKGROUND_SUCCESS};\n box-sizing: border-box;\n flex-grow: 1;\n padding: 16px 8px 8px;\n text-decoration: none;\n transition: 0.15s ease;\n\n ${plume.styles.copy.XS} {\n text-align: left;\n color: ${plume.COLORS.TEXT_SECONDARY};\n\n strong {\n text-transform: uppercase;\n font-weight: bold;\n }\n }\n\n @media screen and ${plume.BREAKPOINTS.LAPTOP} {\n padding: 5px 0 8px 8px;\n }\n`\n\nconst RewardBlock = styled.div`\n align-items: baseline;\n display: flex;\n margin-bottom: 8px;\n`\n\nconst RewardPrice = styled(plume.styles.heading.L)<{ status: OrderStatus; isFinishedAndRecurrent?: boolean }>`\n flex: none;\n position: relative;\n\n color: ${(props) => {\n if (props.isFinishedAndRecurrent) {\n return plume.COLORS.TEXT_PRIMARY\n }\n if (props.status === OrderStatus.VALID) {\n return plume.COLORS.SECONDARY_GREEN_800\n }\n if (props.status === OrderStatus.CANCELLED) {\n return plume.COLORS.TEXT_TERTIARY\n }\n if (props.status === OrderStatus.NEED_RENEW || props.status === OrderStatus.FAILED) {\n return plume.COLORS.SECONDARY_YELLOW_800\n }\n }};\n\n ${(props) => {\n if (props.status === OrderStatus.CANCELLED) {\n return css`\n &::after {\n background-color: ${plume.COLORS.TEXT_SECONDARY};\n border-radius: 3px;\n bottom: 10px;\n content: '';\n height: 3px;\n left: -5%;\n position: absolute;\n transform: rotateZ(-16deg);\n width: 110%;\n z-index: 10;\n }\n `\n }\n }}\n`\n\nconst LinkToContribution = styled(plume.Link)`\n align-items: end;\n bottom: 0px;\n display: flex;\n flex: none;\n justify-content: center;\n padding: 8px;\n position: absolute;\n right: 0px;\n\n ${plume.styles.copy.XS} {\n margin-right: 5px;\n }\n\n ${plume.glyphs.Icon} {\n color: ${plume.COLORS.PRIMARY_SAND_500};\n position: relative;\n top: -3px;\n }\n`\n", "import * as React from 'react'\nimport styled from 'styled-components'\n\nimport * as model from '@owl-nest/models'\nimport { MoneyDisplayer } from '@owl-nest/money'\nimport * as plume from '@ulule/owl-kit-components/next'\n\nimport * as projectModel from '../../../../models/project'\n\ntype RewardListPropTypes = {\n displayDetail: boolean\n skuList?: model.sku.Sku<projectModel.ExtraFields>[]\n subtitle?: string\n title: string\n}\n\nexport function RewardList({\n displayDetail,\n skuList = [],\n subtitle,\n title,\n}: RewardListPropTypes): React.ReactElement<RewardListPropTypes> {\n const [isExpanded, setIsExpanded] = React.useState(false)\n const additionalCost =\n skuList?.length === 1 ? skuList[0].type === 'variant' && skuList[0].item.additional_cost : undefined\n\n return (\n <RewardListContainer>\n {displayDetail ? (\n <Rewards>\n <OpenDetails isExpanded={isExpanded} onClick={toggleIsExpanded}>\n <plume.styles.heading.XXXS>{title}</plume.styles.heading.XXXS>\n <plume.glyphs.stroke.CaretDown size={12} />\n </OpenDetails>\n <RewardsListDetail isExpanded={isExpanded}>\n {skuList.map((sku, i) => {\n const additionalCost = sku.type === 'variant' && sku.item.additional_cost\n return (\n <RewardsListItem key={i}>\n {sku.quantity > 1 && <RewardQuantity>{sku.quantity}x</RewardQuantity>}\n <RewardTitle>\n {model.sku.title(sku)}\n {additionalCost && (\n <>\n {'\\u00A0'}(+{'\\u00A0'}\n <MoneyDisplayer amount={additionalCost} currency={sku.item.parent.project.currency} />)\n </>\n )}\n </RewardTitle>\n </RewardsListItem>\n )\n })}\n </RewardsListDetail>\n </Rewards>\n ) : (\n <>\n <plume.styles.heading.XXXS>{title}</plume.styles.heading.XXXS>\n {subtitle && (\n <plume.styles.copy.XS>\n {subtitle}\n {skuList[0].type === 'variant' && additionalCost && (\n <>\n {'\\u00A0'}(+{'\\u00A0'}\n <MoneyDisplayer amount={additionalCost} currency={skuList[0].item.parent.project.currency} />)\n </>\n )}\n </plume.styles.copy.XS>\n )}\n </>\n )}\n </RewardListContainer>\n )\n\n function toggleIsExpanded(): void {\n setIsExpanded(!isExpanded)\n }\n}\n\nconst RewardListContainer = styled.div`\n flex-grow: 1;\n padding: 0 8px;\n max-width: calc(100% - 57px);\n box-sizing: border-box;\n text-align: left;\n\n ${plume.styles.heading.XXXS} {\n max-width: 298px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n`\n\nconst OpenDetails = styled.div<{ isExpanded: boolean }>`\n display: flex;\n align-items: baseline;\n\n ${plume.glyphs.stroke.CaretDown} {\n display: inline-block;\n position: relative;\n margin-left: 5px;\n transform: ${(props) => props.isExpanded && 'rotateX(180deg)'};\n height: 7px;\n }\n`\n\nconst Rewards = styled.div`\n ${plume.styles.heading.XXXS} {\n cursor: pointer;\n display: inline-block;\n user-select: none;\n }\n`\n\nconst RewardTitle = styled(plume.styles.copy.XS)``\n\nconst RewardQuantity = styled(plume.styles.copy.XS)``\n\nconst RewardsListItem = styled.li`\n position: relative;\n\n ${RewardQuantity} {\n position: absolute;\n left: -10px;\n transform: translateX(-100%);\n line-height: 18px;\n }\n\n ${RewardTitle} {\n line-height: 18px;\n white-space: nowrap;\n max-width: calc(100% - 20px);\n text-overflow: ellipsis;\n overflow: hidden;\n\n & + ${RewardTitle} {\n margin-top: 3px;\n }\n }\n`\n\nconst RewardsListDetail = styled.ul<{ isExpanded: boolean }>`\n list-style: none;\n margin: 3px 0 10px;\n padding: 0;\n display: ${(props) => (props.isExpanded ? 'block' : 'none')};\n`\n", "import * as React from 'react'\nimport * as Redux from 'react-redux'\n\nimport * as api from '@owl-nest/api-client/latest'\nimport * as hooks from '@owl-nest/hooks'\n\nimport * as projectModel from '../../../../models/project'\nimport { RootState } from '../../../../../reducers'\nimport * as UFE from '../../../../../UFE'\n\nexport function useLiveEventsSocket(): { liveEventsSocketReturn: hooks.SocketReturn } {\n const project = Redux.useSelector<RootState, projectModel.Project>((state) => state.application.project.data)\n\n const userPermissions = project.permissions.self\n const userCantUpdate = !(userPermissions && userPermissions.includes(api.ProjectSelfPermission.UPDATE))\n\n const eventTypes: hooks.SocketEventType[] = [\n hooks.SocketEventType.VISITOR,\n hooks.SocketEventType.BACKERS,\n hooks.SocketEventType.NEWS_PUBLISHED,\n hooks.SocketEventType.ORDER,\n ]\n\n const liveEventsSocketReturn = hooks.useSocket(`${UFE.LIVE_PROJECT_URL}/${project.id}`)\n\n React.useEffect(() => {\n liveEventsSocketReturn.socketConnected && liveEventsSocketReturn.sendSubscribe(eventTypes)\n }, [liveEventsSocketReturn.socketConnected])\n\n React.useEffect(() => {\n if (userCantUpdate && liveEventsSocketReturn.socketConnected) {\n liveEventsSocketReturn.sendPublish({\n event_type: hooks.SocketEventType.VISITOR,\n })\n }\n }, [liveEventsSocketReturn.socketConnected])\n\n return { liveEventsSocketReturn }\n}\n", "import * as React from 'react'\nimport * as Redux from 'react-redux'\nimport { Link as RouterLink } from 'react-router-dom'\nimport styled, { css } from 'styled-components'\n\nimport * as plume from '@ulule/owl-kit-components/next'\nimport { t } from '@owl-nest/localize'\nimport * as model from '@owl-nest/models'\nimport { CATEGORY, EVENT_TYPE, useTracking } from '@owl-nest/shadow'\n\nimport { useNavigation } from '../../../hooks/useNavigation'\nimport { PATHS } from '../../../paths'\n\nimport * as modalAction from '../../../../actions/modal'\nimport * as projectModel from '../../../models/project'\nimport { RootState } from '../../../../reducers'\nimport * as URLs from '../../../utils/URLs'\nimport { TRACKING_ACTION, TRACKING_SOURCE } from '../utils/trackerEnums'\n\ntype MenuProps = {\n className?: string\n sticky: boolean\n}\n\ntype TooltipValues = 'news' | 'backers' | 'comments' | undefined\n\nfunction MenuComponent({ className, sticky }: MenuProps): React.ReactElement<MenuProps> {\n const navigation = useNavigation()\n const dispatch = Redux.useDispatch()\n\n const tracking = useTracking()\n\n const project = Redux.useSelector<RootState, projectModel.Project>((state) => state.application.project.data)\n const isProjectTab = navigation.is(PATHS.PROJECT)\n const projectIsDonationBased = model.project.isDonationBased(project)\n\n const [tooltipOpen, setTooltipOpen] = React.useState<TooltipValues>() // 'news'|'backers'|'comments'|undefined\n\n function toggleTooltip(value: TooltipValues): void {\n if (value !== tooltipOpen) {\n setTooltipOpen(value)\n } else {\n setTooltipOpen(undefined)\n }\n }\n\n return (\n <>\n <MenuPositionner className={className}>\n <MenuContainer>\n <MenuNav>\n <plume.TabMenu>\n <plume.Tab active={navigation.is(PATHS.PROJECT)}>\n <TabItem as={RouterLink} to={navigation.pathTo(PATHS.PROJECT)}>\n {t('Project')}\n </TabItem>\n </plume.Tab>\n\n {!projectIsDonationBased && (\n <plume.Tab active={navigation.is(PATHS.REWARDS)}>\n <TabItem as={RouterLink} to={navigation.pathTo(PATHS.REWARDS)}>\n {t('Rewards')}\n </TabItem>\n </plume.Tab>\n )}\n\n <plume.Tab active={navigation.is(PATHS.FAQ)}>\n <TabItem as={RouterLink} to={navigation.pathTo(PATHS.FAQ)}>\n {t('FAQ')}\n </TabItem>\n </plume.Tab>\n\n <plume.Tab active={navigation.is(PATHS.NEWS)} disabled={!project.is_online}>\n {project.is_online ? (\n <TabItem as={RouterLink} to={navigation.pathTo(PATHS.NEWS)}>\n {t('Posts')} \n {!!project.news_count && <Counter>{project.news_count}</Counter>}\n </TabItem>\n ) : (\n <>\n <TabItem\n as={plume.Link}\n onMouseEnter={() => {\n toggleTooltip('news')\n }}\n onMouseLeave={() => {\n toggleTooltip(undefined)\n }}\n onTouchStart={() => {\n toggleTooltip('news')\n }}\n disabled\n >\n {t('Posts')} \n </TabItem>\n <plume.Tooltip open={tooltipOpen === 'news'} position={'right'}>\n <plume.styles.copy.S>\n {t('This tab will be visible once the project is live')}\n </plume.styles.copy.S>\n </plume.Tooltip>\n </>\n )}\n </plume.Tab>\n\n <plume.Tab active={navigation.is(PATHS.SUPPORTERS)} disabled={!project.is_online}>\n {project.is_online ? (\n <TabItem as={RouterLink} to={navigation.pathTo(PATHS.SUPPORTERS)}>\n {t('Contributions')} \n {!!project.supporters_count && (\n <Counter>{project.orders_count || project.supporters_count}</Counter>\n )}\n </TabItem>\n ) : (\n <>\n <TabItem\n as={plume.Link}\n onMouseEnter={() => {\n toggleTooltip('backers')\n }}\n onMouseLeave={() => {\n toggleTooltip(undefined)\n }}\n onTouchStart={() => {\n toggleTooltip('backers')\n }}\n disabled\n >\n {t('Contributions')} \n </TabItem>\n <plume.Tooltip open={tooltipOpen === 'backers'} position=\"left\">\n <plume.styles.copy.S>\n {t('This tab will be visible once the project is live')}\n </plume.styles.copy.S>\n </plume.Tooltip>\n </>\n )}\n </plume.Tab>\n\n <plume.Tab active={navigation.is(PATHS.COMMENTS)} disabled={!project.is_online}>\n {project.is_online ? (\n <TabItem as={RouterLink} to={navigation.pathTo(PATHS.COMMENTS)}>\n {t('Comments')} \n {!!project.comments_count && <Counter>{project.comments_count}</Counter>}\n </TabItem>\n ) : (\n <>\n <TabItem\n as={plume.Link}\n onMouseEnter={() => {\n toggleTooltip('comments')\n }}\n onMouseLeave={() => {\n toggleTooltip(undefined)\n }}\n onTouchStart={() => {\n toggleTooltip('comments')\n }}\n disabled\n >\n {t('Comments')} \n </TabItem>\n <plume.Tooltip open={tooltipOpen === 'comments'} position=\"left\">\n <plume.styles.copy.S>\n {t('This tab will be visible once the project is live')}\n </plume.styles.copy.S>\n </plume.Tooltip>\n </>\n )}\n </plume.Tab>\n </plume.TabMenu>\n {sticky && model.project.hasCheckout(project) && BackNowCTA(false)}\n </MenuNav>\n </MenuContainer>\n </MenuPositionner>\n\n {sticky && model.project.hasCheckout(project) && BackNowCTA(true)}\n </>\n )\n\n function BackNowCTA(showOnMobile: boolean) {\n return (\n <CTAWrapper isProjectTab={isProjectTab} showOnMobile={showOnMobile}>\n <plume.styles.button.CallToAction onClick={handleBacking} size=\"medium\">\n {projectIsDonationBased ? t('Donate') : t('Back now')}\n </plume.styles.button.CallToAction>\n </CTAWrapper>\n )\n }\n\n function handleBacking(): void {\n if (project.is_online && !model.project.isFinished<projectModel.ExtraFields>(project)) {\n if (!model.project.isOrdersEnabled<projectModel.ExtraFields>(project)) {\n dispatch(modalAction.toggleModalPaymentDisturbance(true))\n } else {\n tracking.track({\n event: EVENT_TYPE.GENERIC,\n eventCategory: CATEGORY.PROJECT_PAGE,\n eventAction: TRACKING_ACTION.ACCESS_CHECKOUT,\n eventLabel: window.matchMedia(plume.BREAKPOINTS.LAPTOP).matches\n ? TRACKING_SOURCE.STICKY_MENU\n : TRACKING_SOURCE.STICKY_MOBILE,\n eventCallback: () => {\n document.location.href = URLs.getCheckoutURL(project.id)\n },\n })\n }\n } else if (project.post_campaign_link) {\n dispatch(modalAction.toggleModalPostCampaign(true))\n }\n }\n}\n\nexport const Menu = styled(MenuComponent)``\n\nconst MenuPositionner = styled.div`\n background-color: ${plume.COLORS.PRIMARY_WHITE};\n border-bottom: 1px solid ${plume.COLORS.GREY_SHADE_5};\n display: flex;\n justify-content: center;\n width: 100%;\n overflow: auto;\n`\n\nconst MenuContainer = styled.div`\n display: flex;\n height: 64px;\n justify-content: center;\n position: relative;\n width: 100%;\n`\n\nconst MenuNav = styled.nav`\n align-items: center;\n display: flex;\n height: 64px;\n justify-content: space-between;\n margin: 0 auto;\n max-width: 1200px;\n overflow-x: auto;\n overflow-y: hidden;\n width: 100%;\n z-index: 2;\n position: absolute;\n\n ${plume.TabMenu} {\n flex: 0 1 auto;\n }\n`\n\nconst TabItem = styled(plume.styles.heading.XXXS)`\n align-items: center;\n display: flex;\n height: 64px;\n line-height: 64px;\n outline: none;\n text-decoration: none;\n white-space: pre;\n\n ${plume.styles.heading.XXXXXS} {\n margin: 5px 0 0 3px;\n }\n`\n\nconst Counter = styled.div`\n color: ${plume.COLORS.GREY_SHADE_4};\n`\n\nconst CTAWrapper = styled.div<{ isProjectTab: boolean; showOnMobile: boolean }>`\n ${plume.styles.button.CallToAction} {\n display: inline-flex;\n margin: 0 20px;\n width: auto;\n }\n\n /* hide CTA on mobile if user isn't in project detail tab */\n ${({ showOnMobile }) => {\n if (showOnMobile) {\n return css`\n display: none;\n `\n }\n }}\n\n @media not screen and ${plume.BREAKPOINTS.LAPTOP} {\n display: ${({ isProjectTab, showOnMobile }) => (isProjectTab || showOnMobile ? 'block' : 'none')};\n background-color: ${plume.COLORS.PRIMARY_WHITE};\n bottom: 0px;\n box-shadow: ${plume.EFFECTS.SHADOW_5};\n box-sizing: border-box;\n left: 0px;\n padding: 10px;\n position: fixed;\n width: 100%;\n z-index: ${plume.ZINDEX.ABOVE};\n\n ${plume.styles.button.CallToAction} {\n display: flex;\n margin: auto;\n width: 100%;\n }\n }\n`\n", "import * as React from 'react'\nimport * as Redux from 'react-redux'\nimport { createPortal } from 'react-dom'\n\nimport * as api from '@owl-nest/api-client/latest'\nimport * as layout from '@ulule/layout'\nimport * as shadow from '@owl-nest/shadow'\nimport { useAuth } from '@owl-nest/redux-wrapper/hooks'\nimport { TaxDeductionModal } from '@owl-nest/tip'\n\nimport * as modalAction from '../../actions/modal'\nimport * as modalReducer from '../../reducers/modals/followModal'\nimport * as modalSubmitReducer from '../../reducers/modals/submitModal'\nimport * as modalVariantReducer from '../../reducers/modals/variantModal'\nimport * as projectModel from '../models/project'\nimport { RootState } from '../../reducers'\n\nimport { FollowProjectModal } from '../views/detail/components/Modal'\nimport { LaunchShareModal } from '../views/detail/components/LaunchShareModal'\nimport { PaymentDisturbanceModal } from '../views/detail/components/PaymentDisturbanceModal'\nimport { RewardModals } from '../views/detail/components/RewardModals'\nimport { TRACKING_SOURCE } from '../views/detail/utils/trackerEnums'\n\nimport { LilSam } from '../components/LilSam'\nimport { SubmitModal } from '../components/LilSam/view/Submit/index'\nimport { ShareOverlay } from '../components/ShareOverlay'\n\ntype PublicLayoutProps = {\n children: React.ReactNode\n}\n\nexport function PublicLayout({ children }: PublicLayoutProps): React.ReactElement<PublicLayoutProps> {\n const dispatch = Redux.useDispatch()\n const project = Redux.useSelector<RootState, projectModel.Project>((state) => state.application.project.data)\n const auth = useAuth()\n const isOwner = auth.type === 'loggedin' && auth.user.id === project.owner.id\n const userIsAuthenticated = auth.type === 'loggedin'\n\n const modalFollow = Redux.useSelector<RootState, modalReducer.State>((state) => state.application.followModal)\n const modalSubmit = Redux.useSelector<RootState, modalSubmitReducer.State>((state) => state.application.submitModal)\n const modalVariant = Redux.useSelector<RootState, modalVariantReducer.State>(\n (state) => state.application.variantModal,\n )\n\n const modalContainerCached = React.useMemo(() => document.getElementById('modal-container') ?? document.body, [])\n\n return (\n <>\n {children}\n\n <ShareOverlay />\n\n {createPortal(<RewardModals />, modalContainerCached)}\n\n {createPortal(<PaymentDisturbanceModal />, modalContainerCached)}\n\n {createPortal(\n <FollowProjectModal\n isOpen={modalFollow.open}\n onClose={() => {\n dispatch(modalAction.toggleModalFollow(false))\n }}\n userIsAuthenticated={userIsAuthenticated}\n />,\n modalContainerCached,\n )}\n\n {createPortal(\n <SubmitModal\n open={modalSubmit.open}\n onClose={modalSubmit.handleClose}\n onSubmit={modalSubmit.handleSubmit}\n project={project}\n />,\n modalContainerCached,\n )}\n\n {createPortal(<LaunchShareModal project={project} />, modalContainerCached)}\n {createPortal(\n <layout.modals.ShareProject\n project={project}\n trackingConfig={{\n category: shadow.CATEGORY.PROJECT_PAGE,\n source: TRACKING_SOURCE.HERO,\n }}\n />,\n modalContainerCached,\n )}\n\n <TaxDeductionModal project={project} />\n </>\n )\n}\n", "import React from 'react'\nimport styled from 'styled-components'\n\nimport { t, tc } from '@owl-nest/localize'\nimport { searchParams } from '@owl-nest/utils'\nimport * as plume from '@ulule/owl-kit-components/next'\nimport * as env from '@owl-nest/config'\n\ntype FollowProjectModalProps = {\n isOpen: boolean\n onClose: () => void\n userIsAuthenticated: boolean\n}\n\nconst nextAwareURL = (url: string): string => {\n const params = { next: window.location.href }\n return searchParams.addSearchParamsToUrl(url, params)\n}\n\nexport const FollowProjectModal = ({\n isOpen,\n onClose,\n userIsAuthenticated,\n}: FollowProjectModalProps): React.ReactElement<FollowProjectModalProps> => (\n <ModalWithIcon\n closable\n open={isOpen}\n onClose={onClose}\n icon={<plume.illustrations.twoToned.EnvelopeWithHeart size={120} noBackground />}\n svgScale={0.825}\n >\n <ModalContent>\n <>\n {userIsAuthenticated ? (\n <>\n <plume.styles.heading.XXS>{t('Project followed')}</plume.styles.heading.XXS>\n <plume.styles.copy.S>\n {t('You will receive project posts and be notified by email 48 hours before the end of the project.')}\n </plume.styles.copy.S>\n <StyledCallToAction onClick={onClose}>{t('Ok, thanks')}</StyledCallToAction>\n </>\n ) : (\n <>\n <plume.styles.heading.XXS>{t('Follow this project')}</plume.styles.heading.XXS>\n <plume.styles.copy.S>\n {tc(\n `[loginLink: Log in] to your Ulule account to follow this project. Don't have an account? [signupLink: Sign up] now.`,\n {\n loginLink: <plume.Link href={nextAwareURL(env.SIGNIN_URL)} tinted />,\n signupLink: <plume.Link href={nextAwareURL(env.SIGNUP_URL)} tinted />,\n },\n )}\n </plume.styles.copy.S>\n <br />\n <plume.styles.copy.XS>\n <plume.Link kind=\"secondary\" onClick={() => onClose()}>\n {t('Later')}\n </plume.Link>\n </plume.styles.copy.XS>\n </>\n )}\n </>\n </ModalContent>\n </ModalWithIcon>\n)\n\nconst StyledCallToAction = styled(plume.styles.button.CallToAction)``\n\nconst ModalWithIcon = styled(plume.ModalWithIcon)``\n\nconst ModalContent = styled.div`\n text-align: center;\n\n ${StyledCallToAction} {\n margin-top: 30px;\n }\n\n ${plume.styles.heading.XXS} {\n margin-bottom: 10px;\n margin-top: 10px;\n }\n`\n", "import * as React from 'react'\nimport styled from 'styled-components'\n\nimport * as plume from '@ulule/owl-kit-components/next'\n\nimport * as api from '@owl-nest/api-client/next'\nimport * as hooks from '@owl-nest/hooks'\nimport { t, tc } from '@owl-nest/localize'\nimport * as shadow from '@owl-nest/shadow'\nimport * as layout from '@ulule/layout'\n\nimport * as UFE from '../../../../UFE'\n\nimport { TRACKING_SOURCE } from '../utils/trackerEnums'\n\ntype LaunchShareModalProps = {\n project: api.Project\n}\n\nexport function LaunchShareModal({ project }: LaunchShareModalProps): React.ReactElement {\n const { href, search } = window.location\n const urlParams = new URLSearchParams(search)\n\n const setIsProjectDetailLaunchShareModalOpen = hooks.useSetModal('ProjectDetailLaunchShare')\n\n const modalCalloutMessage = getCalloutMessage()\n\n return (\n <layout.modals.ShareProject\n closable={false}\n enableConfetti\n modalId=\"ProjectDetailLaunchShare\"\n modalButtons={[\n {\n type: 'button',\n props: {\n kind: 'primary',\n type: 'button',\n onClick: () => {\n urlParams.delete('launch')\n const newUrl = href.replace(search.substring(1), urlParams.toString())\n window.history.replaceState({}, '', newUrl)\n setIsProjectDetailLaunchShareModalOpen(false)\n },\n children: t('See my project'),\n },\n },\n ]}\n modalHero={\n <>\n <ModalTitle>{t('Congratulations, your project is live!')}</ModalTitle>\n <ModalDescription>\n {t(\n 'Your campaign starts now: share your project with your first circle to to raise the gauge and launch this adventure.',\n )}\n </ModalDescription>\n {modalCalloutMessage && <Callout type=\"success\">{modalCalloutMessage}</Callout>}\n </>\n }\n modalPastille={<plume.illustrations.twoToned.Rocket size={plume.utils.isMobile() ? 52 : 120} />}\n publicUser={UFE.CURRENT_USER}\n project={project}\n sharingContext=\"success-modal\"\n trackingConfig={{ category: shadow.CATEGORY.PROJECT_PAGE, source: TRACKING_SOURCE.HERO }}\n />\n )\n\n function getCalloutMessage(): string | undefined {\n if (project.onboarding_steps?.import_community?.import_type === api.ImportType.PREVIOUS_BACKER) {\n return project.fans_count > 1\n ? t(\n 'The %(fansCount)d pre-registered fans as well as all the backers of your previous project(s) have been notified by email.',\n { fansCount: project.fans_count },\n )\n : t('All previous backers for your past project(s) has been notified by email.')\n } \n \n if (project.onboarding_steps?.import_community?.import_type === api.ImportType.NONE) {\n if (project.fans_count > 1) {\n return t('The %(fansCount)d pre-registered fans have been notified by email.', {\n fansCount: project.fans_count,\n })\n }\n }\n\n return undefined\n }\n}\n\nconst ModalDescription = styled(plume.styles.copy.M)`\n text-align: center;\n`\n\nconst ModalTitle = styled(plume.styles.heading.L)`\n margin-bottom: 16px;\n text-align: center;\n`\n\nconst Callout = styled(plume.Callout)`\n margin-bottom: 32px;\n`\n", "import * as React from 'react'\nimport * as Redux from 'react-redux'\nimport styled from 'styled-components'\n\nimport { t } from '@owl-nest/localize'\nimport * as plume from '@ulule/owl-kit-components/next'\n\nimport { RootState } from '../../../../reducers'\nimport * as modalAction from '../../../../actions/modal'\nimport * as modalReducer from '../../../../reducers/modals/paymentDisturbanceModal'\n\nimport { TRACKING_SOURCE } from '../utils/trackerEnums'\n\nimport { FollowProjectButton } from './FollowProjectButton'\n\ntype PaymentDisturbanceModalProps = {\n className?: string\n}\n\nfunction PaymentDisturbanceModalComponent({ className }: PaymentDisturbanceModalProps): React.ReactElement {\n const dispatch = Redux.useDispatch()\n\n const modal = Redux.useSelector<RootState, modalReducer.State>((state) => state.application.paymentDisturbanceModal)\n const handleClosing = (): void => {\n dispatch(modalAction.toggleModalPaymentDisturbance(false))\n }\n\n return (\n <plume.ModalWithIcon\n className={className}\n open={modal.open}\n closable={true}\n onClose={handleClosing}\n icon={<plume.illustrations.twoToned.WarningSign size={120} />}\n svgScale={0.88}\n >\n <plume.styles.heading.S>{t('Payment temporarily unavailable')}</plume.styles.heading.S>\n <plume.styles.copy.M>\n {t(\n 'Due to a technical maintenance of our payment provider, we are obliged to suspend all payments tonight on our platform.',\n )}\n </plume.styles.copy.M>\n <plume.styles.copy.M>\n {t('You will be able to contribute to this project again from 7am (Paris time).')}\n </plume.styles.copy.M>\n <plume.styles.copy.M>\n {t('We invite you to subscribe to the project to receive posts and back it later.')}\n </plume.styles.copy.M>\n <CTAWrapper>\n <FollowProjectButton source={TRACKING_SOURCE.PAYMENT_DISTURBANCE} />\n <plume.LinkAsButton kind=\"secondary\" onClick={handleClosing}>\n {t('Close this window')}\n </plume.LinkAsButton>\n </CTAWrapper>\n </plume.ModalWithIcon>\n )\n}\n\nexport const PaymentDisturbanceModal = styled(PaymentDisturbanceModalComponent)`\n ${plume.styles.modal.Body} {\n display: flex;\n flex-direction: column;\n }\n\n ${plume.styles.heading.S} {\n text-align: left;\n margin: 15px 0;\n }\n\n ${plume.styles.copy.M} {\n text-align: left;\n margin-bottom: 25px;\n }\n\n @media screen and ${plume.BREAKPOINTS.TABLET} {\n ${plume.styles.modal.Wrapper} {\n max-width: 390px;\n }\n }\n`\n\nexport const CTAWrapper = styled.div`\n display: flex;\n margin: 0 auto;\n flex-direction: column;\n\n ${plume.LinkAsButton} {\n display: block;\n margin: 0 auto;\n width: fit-content;\n }\n`\n", "import * as React from 'react'\nimport * as Redux from 'react-redux'\n\nimport * as model from '@owl-nest/models'\n\nimport * as modalAction from '../../../../actions/modal'\nimport * as projectModel from '../../../models/project'\nimport { RootState } from '../../../../reducers'\nimport * as modalReducer from '../../../../reducers/modals/rewardModal'\n\nimport { PostCampaignModal } from './PostCampaignModal'\nimport { RewardModal } from './RewardModal'\n\nexport function RewardModals(): React.ReactElement<unknown> {\n const dispatch = Redux.useDispatch()\n\n const project = Redux.useSelector<RootState, projectModel.Project>((state) => state.application.project.data)\n const modal = Redux.useSelector<RootState, modalReducer.State>((state) => state.application.rewardModal)\n\n const hideRewardModal = model.project.isFinished<projectModel.ExtraFields>(project) || project.is_cancelled\n const sharedRewardId = modal.rewardId\n\n React.useEffect(() => {\n // check if we need to show post campaign modal\n // show this modal if project is finished, and post campaign link is set\n // and if user have a selected reward in url\n if (hideRewardModal && sharedRewardId.length > 0) {\n dispatch(modalAction.toggleModalPostCampaign(true))\n }\n }, [sharedRewardId])\n\n return (\n <>\n {!hideRewardModal && <RewardModal />}\n <PostCampaignModal />\n </>\n )\n}\n", "import React from 'react'\nimport * as Redux from 'react-redux'\nimport styled from 'styled-components'\n\nimport { t } from '@owl-nest/localize'\nimport * as model from '@owl-nest/models'\nimport { CATEGORY, EVENT_TYPE, useTracking } from '@owl-nest/shadow'\n\nimport * as plume from '@ulule/owl-kit-components/next'\n\nimport * as modalAction from '../../../../actions/modal'\nimport * as projectModel from '../../../models/project'\nimport { TRACKING_ACTION, TRACKING_SOURCE } from '../../../views/detail/utils/trackerEnums'\nimport * as modalReducer from '../../../../reducers/modals/postCampaignModal'\nimport { RootState } from '../../../../reducers'\n\nconst Wrapper = styled.div`\n align-items: center;\n display: flex;\n flex-direction: column;\n justify-content: center;\n`\n\n// TODO: Discuss use of another Heading style to avoid overriding the `font-weight`\nconst Title = styled(plume.styles.heading.XXS)`\n font-weight: 700;\n margin-bottom: 10px;\n`\n\nconst Text = styled(plume.styles.copy.S)`\n margin-bottom: 15px;\n`\n\nconst Button = styled(plume.styles.button.CallToAction)`\n background-color: ${plume.COLORS.PRIMARY_GREEN};\n margin-bottom: 10px;\n transition: 0.3s ease;\n\n &:hover {\n background-color: ${plume.COLORS.PRIMARY_GREEN_HOVER};\n }\n`\n\nexport const PostCampaignModal = (): React.ReactElement<unknown> => {\n const dispatch = Redux.useDispatch()\n\n const project = Redux.useSelector<RootState, projectModel.Project>((state) => state.application.project.data)\n const modal = Redux.useSelector<RootState, modalReducer.State>((state) => state.application.postCampaingModal)\n\n const tracking = useTracking()\n\n const postCampaignLink = project?.post_campaign_link\n const offboardingType = project?.onboarding_steps?.offboarding?.type\n const boutiqueLink = project?.boutique_link\n\n const handleClosing = (): void => {\n dispatch(modalAction.toggleModalPostCampaign(false))\n dispatch(modalAction.setRewardId(''))\n }\n\n let previewTranslations = {\n button: t('Order'),\n text: t('Rest assured! We\u2019re selling here \uD83D\uDC47'),\n title: t('Did you miss the campaign?'),\n }\n if (offboardingType) {\n if (offboardingType === 'support') {\n previewTranslations = {\n button: t('Back the project'),\n text: t('Rest assured! Back the project here \uD83D\uDC47'),\n title: t('Did you miss the campaign?'),\n }\n } else if (offboardingType === 'follow') {\n previewTranslations = {\n button: t('Follow the project'),\n text: t('Follow us here \uD83D\uDC47'),\n title: t('Did you miss the campaign?'),\n }\n }\n }\n\n if (postCampaignLink === undefined) {\n return (\n <plume.Modal\n open={modal.open}\n closable\n onClose={handleClosing}\n buttons={{\n type: 'buttonAsLink',\n props: {\n href: project.main_tag?.absolute_url,\n children: t('All live projects'),\n },\n }}\n >\n <Wrapper>\n <Title>{t('Did you miss the campaign?')}</Title>\n <Text>\n {t('Discover more %(mainTag)s live projects \uD83D\uDC47', {\n mainTag: model.project.mainTag<projectModel.ExtraFields>(project),\n })}\n </Text>\n </Wrapper>\n </plume.Modal>\n )\n }\n\n return (\n <plume.Modal\n open={modal.open}\n closable\n onClose={handleClosing}\n buttons={{\n type: 'buttonAsLink',\n props: {\n href: postCampaignLink.url,\n onClick: track,\n children: previewTranslations.button,\n },\n }}\n >\n <Wrapper>\n <Title>{previewTranslations.title}</Title>\n <Text>{previewTranslations.text}</Text>\n </Wrapper>\n </plume.Modal>\n )\n\n function track() {\n if (offboardingType !== undefined) {\n tracking.track({\n event: EVENT_TYPE.GENERIC,\n eventCategory: CATEGORY.PROJECT_PAGE,\n eventAction: TRACKING_ACTION.CLICK_OFFBOARDING,\n eventLabel: TRACKING_SOURCE.MODAL,\n eventValue: offboardingType,\n })\n }\n }\n}\n", "import * as React from 'react'\nimport * as Redux from 'react-redux'\nimport styled from 'styled-components'\n\nimport { t, tc } from '@owl-nest/localize'\nimport * as model from '@owl-nest/models'\nimport * as plume from '@ulule/owl-kit-components/next'\n\nimport * as modalAction from '../../../../actions/modal'\nimport { useReward } from '../hooks/useReward'\nimport * as projectModel from '../../../models/project'\nimport { RootState } from '../../../../reducers'\nimport * as modalReducer from '../../../../reducers/modals/rewardModal'\nimport { TRACKING_SOURCE } from '../utils/trackerEnums'\nimport * as URLs from '../../../utils/URLs'\nimport { BaseReward } from './Rewards/BaseReward'\n\nconst RewardList = styled.div``\n\nexport const RewardModal = (): React.ReactElement<unknown> => {\n const dispatch = Redux.useDispatch()\n\n const project = Redux.useSelector<RootState, projectModel.Project>((state) => state.application.project.data)\n const modal = Redux.useSelector<RootState, modalReducer.State>((state) => state.application.rewardModal)\n const { rewards } = project\n const sharedRewardId = modal.rewardId\n\n const [reward, setReward] = React.useState<model.reward.Reward<projectModel.ExtraFields>>()\n\n const { handleClick } = useReward()\n const trackingSource =\n reward?.is_hidden || !reward?.available ? TRACKING_SOURCE.REWARD_MODAL : TRACKING_SOURCE.PROJECT_BACKERS_LISTING\n\n React.useEffect(() => {\n if (sharedRewardId && rewards) {\n const selectedReward = rewards.find((projectReward) => {\n return projectReward.id === parseInt(sharedRewardId)\n })\n if (selectedReward) {\n const modeledSelectedReward = model.reward.Reward<projectModel.ExtraFields>(selectedReward, project)\n setReward(modeledSelectedReward)\n }\n }\n }, [sharedRewardId])\n\n React.useEffect(() => {\n // HACK: On iOS < 14, Safari scrolls the main document body instead of scrolling modal contents.\n // To counter that, as a quick'n'dirty solution, we add a `no-scroll` class to the body, in order to be able to hide its contents when a modal is open.\n const body = document.body\n\n if (modal.open) {\n body.classList.add('no-scroll')\n } else {\n body.classList.remove('no-scroll')\n }\n }, [modal.open])\n\n return reward ? (\n <StyledModal\n open={modal.open}\n closable\n onClose={() => {\n dispatch(modalAction.toggleModalReward(false))\n dispatch(modalAction.setRewardId(''))\n }}\n >\n {reward.is_hidden && reward.available ? (\n <TextContainer>\n <plume.styles.heading.L>{t('A reward just for you!')}</plume.styles.heading.L>\n <plume.styles.copy.S>\n {tc('%(ownername)s has granted you access to a secret reward, would you like to have it?', {\n ownername: model.user.fullName(project.owner),\n })}\n </plume.styles.copy.S>\n </TextContainer>\n ) : (\n !reward.available && (\n <TextContainer>\n <plume.styles.heading.L>{t(\"You're too late...\")}</plume.styles.heading.L>\n <plume.styles.copy.S>\n {t('This reward is already sold out, but there are plenty more!')}\n </plume.styles.copy.S>\n </TextContainer>\n )\n )}\n <RewardList>\n <BaseReward\n reward={reward}\n onClick={(id, optionValuesIds) => {\n handleClick(id, { optionValuesIds, trackingExtraData: { source: trackingSource } })\n }}\n />\n </RewardList>\n\n <ActionsWrapper>\n {!(reward?.variants?.length && reward.variants.length > 0) && (\n <>\n {!reward.available ? (\n <StyledCallToAction\n onClick={() => {\n if (!model.project.isOrdersEnabled<projectModel.ExtraFields>(project)) {\n dispatch(modalAction.toggleModalPaymentDisturbance(true))\n } else {\n window.location.href = URLs.getCheckoutURL(project.id)\n }\n }}\n >\n {t('See available rewards')}\n </StyledCallToAction>\n ) : (\n <StyledCallToAction\n onClick={() => {\n handleClick(reward.id, { trackingExtraData: { source: trackingSource } })\n }}\n >\n {t('Choose this reward')}\n </StyledCallToAction>\n )}\n </>\n )}\n <plume.Link\n kind=\"secondary\"\n onClick={(event) => {\n event.preventDefault()\n dispatch(modalAction.toggleModalReward(false))\n dispatch(modalAction.setRewardId(''))\n }}\n href=\"#\"\n >\n {t('Close')}\n </plume.Link>\n </ActionsWrapper>\n </StyledModal>\n ) : (\n <></>\n )\n}\n\nconst ActionsWrapper = styled.div`\n margin: 0 auto;\n text-align: center;\n margin-top: 17px;\n\n @media screen and ${plume.BREAKPOINTS.TABLET} {\n width: 361px;\n }\n`\n\nconst StyledModal = styled(plume.Modal)`\n ${plume.styles.modal.Body} {\n margin-top: 20px;\n }\n\n // HACK: On iOS < 14, Safari scrolls the main document body instead of scrolling modal contents.\n // As a partial counter, we enlarge modal contents and reset the overflow on Apple devices.\n @supports (-webkit-overflow-scrolling: touch) {\n ${plume.styles.modal.Body} {\n max-height: 70vh;\n overflow: auto;\n }\n }\n`\n\nconst StyledCallToAction = styled(plume.styles.button.CallToAction)`\n margin-bottom: 8px;\n`\n\nconst TextContainer = styled.div`\n text-align: center;\n margin-bottom: 35px;\n\n @media screen and ${plume.BREAKPOINTS.TABLET} {\n width: 361px;\n display: block;\n margin: 0 auto;\n margin-bottom: 35px;\n }\n\n ${plume.styles.heading.L} {\n margin-bottom: 10px;\n display: block;\n text-align: center;\n }\n`\n\nexport default RewardModal\n", "import * as React from 'react'\nimport * as Redux from 'react-redux'\nimport styled from 'styled-components'\n\nimport { t, tnc } from '@owl-nest/localize'\nimport { useCopy } from '@owl-nest/copier'\n\nimport * as plume from '@ulule/owl-kit-components/next'\n\nimport { RootState } from '../../reducers'\nimport * as projectModel from '../models/project'\nimport * as modalActions from '../../actions/modal'\nimport { useNavigation } from '../hooks/useNavigation'\nimport { PATHS } from '../paths'\nimport { Link as RouterLink } from 'react-router-dom'\nimport { ComingSoonContent } from '../views/coming-soon'\nimport { BrowserScreenshot } from './BrowserScreenshot'\n\nexport function ShareOverlay(): React.ReactElement<unknown> {\n const { canCopy, copy, copyStatus } = useCopy()\n const project = Redux.useSelector<RootState, projectModel.Project>((state) => state.application.project.data)\n const isShareOverlayOpen = Redux.useSelector<RootState, boolean>((state) => state.application.shareOverlay.open)\n const dispatch = Redux.useDispatch()\n const navigation = useNavigation()\n\n const canonicalComingSoon = `${window.location.origin}/${project.slug}/coming-soon`\n\n if (isShareOverlayOpen) {\n window.location.hash = 'share'\n }\n\n return (\n <ShareOverlayModal\n closable\n open={isShareOverlayOpen}\n onClose={() => {\n // remove hash from url when modale is closed\n // we used replaceState because we need to remove completly hash\n // if we have a empty hash, it's make a scroll into project information\n history.replaceState(null, '', ' ')\n dispatch(modalActions.toggleShareOverlay(false))\n }}\n >\n <Texts>\n <plume.illustrations.twoToned.Share size={90} />\n <plume.styles.heading.L>{t('Share your Ulule coming soon page')}</plume.styles.heading.L>\n <plume.styles.copy.S>\n {t(\n 'Prepare for your launch by sharing your \"Coming Soon\" page with your first circle and community. Each fan will automatically receive an email when your project is launched!',\n )}\n </plume.styles.copy.S>\n </Texts>\n\n <Screenshot href={canonicalComingSoon}>\n <ComingSoonContent iframe />\n </Screenshot>\n\n <Texts>\n {!navigation.is(PATHS.COMING_SOON) && (\n <plume.styles.button.Button\n as={RouterLink}\n size=\"medium\"\n onClick={openComingSoon}\n to={navigation.pathTo(PATHS.COMING_SOON)}\n target=\"_blank\"\n >\n {t('Open coming soon page')}\n </plume.styles.button.Button>\n )}\n\n <CopyInput>\n <plume.styles.input.Input type=\"text\" disabled value={canonicalComingSoon} />\n {canCopy && copyStatus && (\n <plume.styles.tooltip.BlockAnchor>\n <plume.Tooltip fitToContent position=\"top\" open={copyStatus !== 'idle'}>\n {copyStatus === 'succeeded' && (\n <>\n <plume.glyphs.stroke.CheckCircle size={16} />\n <plume.styles.copy.S>{t('Link copied to your clipboard.')}</plume.styles.copy.S>\n </>\n )}\n {copyStatus === 'failed' && (\n <>\n <plume.glyphs.stroke.TimesCircle size={16} />\n <plume.styles.copy.S>\n {t(\"Sorry, we couldn't copy the link. Please try again!\")}\n </plume.styles.copy.S>\n </>\n )}\n </plume.Tooltip>\n <plume.LinkAsButton onClick={() => copy(canonicalComingSoon)} tinted>\n <plume.glyphs.stroke.Link size={16} />\n {t('Copy link')}\n </plume.LinkAsButton>\n </plume.styles.tooltip.BlockAnchor>\n )}\n </CopyInput>\n <plume.styles.copy.S>\n {project.fans_count === 0\n ? t(\"You don't have any fan yet, share your link!\")\n : tnc('You currently have [count] fan', 'You currently have [count] fans', project.fans_count, {\n count: (\n <plume.styles.heading.S as=\"span\" dangerouslySetInnerHTML={{ __html: String(project.fans_count) }} />\n ),\n })}\n </plume.styles.copy.S>\n </Texts>\n </ShareOverlayModal>\n )\n\n function openComingSoon(): void {\n dispatch(modalActions.toggleShareOverlay(false))\n }\n}\n\nconst CopyInput = styled.div`\n display: flex;\n\n ${plume.styles.input.Input} {\n flex: 1;\n }\n\n ${plume.LinkAsButton} {\n flex: 0 0 auto;\n }\n\n ${plume.styles.tooltip.BlockAnchor} {\n display: inline-block;\n margin-left: 12px;\n margin-bottom: 12px;\n\n ${plume.glyphs.stroke.CheckCircle} {\n color: ${plume.COLORS.PRIMARY_GREEN};\n margin-right: 6px;\n margin-top: 2px;\n }\n\n ${plume.glyphs.stroke.TimesCircle} {\n color: ${plume.COLORS.PRIMARY_RED};\n margin-right: 6px;\n margin-top: 2px;\n }\n\n ${plume.Tooltip} {\n margin-bottom: 16px;\n\n ${plume.styles.copy.S} {\n margin-bottom: 0;\n }\n }\n }\n`\n\nconst Screenshot = styled(BrowserScreenshot)`\n max-width: 270px;\n width: 100%;\n margin-top: -20px;\n\n @media screen and ${plume.BREAKPOINTS.MOBILE_M} {\n max-width: 327px;\n }\n\n @media screen and ${plume.BREAKPOINTS.MOBILE_L} {\n max-width: 377px;\n }\n\n @media screen and ${plume.BREAKPOINTS.TABLET} {\n max-width: 522px;\n }\n`\n\nconst Texts = styled.div`\n text-align: center;\n\n ${plume.styles.heading.L} {\n margin: 25px 0 20px;\n text-align: center;\n }\n\n ${plume.styles.copy.S} {\n max-width: 456px;\n text-align: center;\n margin: 0 auto 45px;\n }\n\n ${plume.illustrations.Illustration} {\n margin-top: 42px;\n }\n\n ${CopyInput} {\n max-width: 586px;\n margin: 20px 0;\n width: 100%;\n }\n`\n\nconst ShareOverlayModal = styled(plume.OverlayModal)`\n top: ${plume.SIZES.HEADER_DESKTOP_HEIGHT};\n\n ${plume.styles.modal.Body} {\n display: flex;\n flex-direction: column;\n align-items: center;\n\n ${Screenshot} {\n margin-bottom: 20px;\n }\n }\n`\n", "import * as React from 'react'\nimport styled, { css } from 'styled-components'\n\nimport { tc } from '@owl-nest/localize'\nimport { useAuth } from '@owl-nest/redux-wrapper/hooks'\nimport * as plume from '@ulule/owl-kit-components/next'\n\nimport { styles as S, BREAKPOINTS, COLORS, Link } from '@ulule/owl-kit-components/next'\n\nimport { Home } from './Home'\nimport { Context } from './Context'\nimport { PublicLayout } from '../../layout/PublicLayout'\n\nimport { ComingSoonHeader } from './components/ComingSoonHeader'\n\nexport function ComingSoon(): React.ReactElement<unknown> {\n const auth = useAuth()\n\n return (\n <PublicLayout>\n <ComingSoonWrapper>\n <ComingSoonHeader />\n <ComingSoonContent />\n </ComingSoonWrapper>\n <LegalTextWrapper>\n <plume.styles.copy.XS>\n {tc(\n 'By subscribing to this fundraising project, you will first receive an email notification as soon as it is launched, followed by publications sent out by the project team.[br]You can unsubscribe from these communications at any time from the fundraising page.[br]Your e-mail address is also communicated to the project team, which agrees to use it only to communicate with you about the fundraising campaign. For more information, please consult [link: our privacy policy].',\n {\n br: <br />,\n link: (\n <plume.Link href=\"https://www.ulule.com/about/privacy/\" target=\"_blank\" rel=\"noopener noreferrer\" />\n ),\n strong: <strong />,\n },\n )}\n </plume.styles.copy.XS>\n </LegalTextWrapper>\n </PublicLayout>\n )\n}\n\ntype ComingSoonContentProps = {\n iframe?: boolean\n}\n\nexport function ComingSoonContent({\n iframe = false,\n}: ComingSoonContentProps): React.ReactElement<ComingSoonContentProps> {\n return (\n <MainContent iframe={iframe}>\n <Context iframe={iframe} />\n <Home iframe={iframe} />\n </MainContent>\n )\n}\n\nconst MainContent = styled.div<{ iframe?: boolean }>`\n align-items: stretch;\n background-color: ${COLORS.PRIMARY_SAND};\n border-radius: 4px;\n display: flex;\n flex-direction: column;\n margin: 0px 20px;\n\n @media screen and ${BREAKPOINTS.TABLET} {\n margin: 0px 64px;\n }\n\n @media screen and ${BREAKPOINTS.LAPTOP} {\n min-height: 45vh;\n align-items: center;\n }\n\n ${({ iframe }) => {\n if (iframe) {\n return css`\n width: max-content;\n transform: scale(0.335);\n transform-origin: 0 -30px;\n\n @media screen and ${BREAKPOINTS.MOBILE_M} {\n transform: scale(0.43);\n transform-origin: 0 0px;\n }\n\n @media screen and ${BREAKPOINTS.MOBILE_L} {\n transform: scale(0.5);\n transform-origin: 0 36px;\n }\n\n @media screen and ${BREAKPOINTS.TABLET} {\n transform: scale(0.43);\n margin: 0px 20px;\n }\n\n @media screen and ${BREAKPOINTS.LAPTOP} {\n transform: scale(0.42);\n transform-origin: 0 20px;\n }\n\n @media screen and ${BREAKPOINTS.LAPTOP_L} {\n transform: scale(0.373);\n }\n `\n }\n }}\n`\n\nconst ComingSoonWrapper = styled.div`\n ${MainContent} {\n margin-bottom: 10px;\n }\n\n ${S.copy.XS} {\n text-align: center;\n }\n`\n\nconst LegalTextWrapper = styled.div`\n margin: 25px auto;\n max-width: 80%;\n width: fit-content;\n\n ${plume.styles.copy.XS} {\n color: ${plume.COLORS.GREY_SHADE_1};\n text-align: center;\n }\n\n @media screen and ${BREAKPOINTS.LAPTOP} {\n max-width: 850px;\n margin: 25px auto;\n }\n`\n", "import * as React from 'react'\nimport * as Redux from 'react-redux'\nimport styled, { css } from 'styled-components'\n\nimport * as api from '@owl-nest/api-client/latest'\nimport { useAuth } from '@owl-nest/redux-wrapper/hooks'\nimport * as shadow from '@owl-nest/shadow'\n\nimport * as plume from '@ulule/owl-kit-components/next'\n\nimport { Like } from './Like'\nimport * as projectModel from '../../../models/project'\nimport { RootState } from '../../../../reducers'\nimport { SuccessMessage } from './SuccessMessage'\nimport { SplashTitle } from '../components/SplashTitle'\nimport { Title } from './Title'\nimport { likeProject } from '../../../../actions/project'\n\ntype HomeProps = {\n iframe: boolean\n}\n\nexport function Home({ iframe }: HomeProps): React.ReactElement<HomeProps> {\n const dispatch = Redux.useDispatch()\n const project = Redux.useSelector<RootState, projectModel.Project>((state) => state.application.project.data)\n const defaultFollowers = [\n api.UserRole.Editor,\n api.UserRole.Fan,\n api.UserRole.Moderator,\n api.UserRole.Owner,\n api.UserRole.Supporter,\n ]\n const auth = useAuth()\n const tracking = shadow.useTracking()\n\n const [isUserFan, setIsUserFan] = React.useState(!!project.user_role && defaultFollowers.includes(project.user_role))\n const [isLoading, setIsLoading] = React.useState(false)\n\n const showTitle = auth.type !== 'existing' && !isLoading && !isUserFan\n\n return (\n <HomeWrapper iframe={iframe}>\n {showTitle && <Title />}\n\n <Block>\n {iframe ? (\n <Like onLoggedIn={onLoggedIn} onLike={onLike} />\n ) : isLoading ? (\n <CenterSpinner>\n <plume.Spinner />\n </CenterSpinner>\n ) : isUserFan ? (\n <SuccessMessage auth={auth} />\n ) : (\n <Like onLoggedIn={onLoggedIn} onLike={onLike} />\n )}\n </Block>\n </HomeWrapper>\n )\n\n async function onLike(): Promise<void> {\n if (auth.type === 'loggedin' || auth.type === 'loggedin-as-guest') {\n setIsLoading(true)\n await like()\n setIsLoading(false)\n }\n }\n\n async function onLoggedIn(user: api.AuthenticatedUser<any>): Promise<void> {\n setIsLoading(true)\n await like(user)\n setIsLoading(false)\n }\n\n async function like(user?: api.AuthenticatedUser<any>): Promise<void> {\n await dispatch(likeProject(project.id))\n setIsUserFan(true)\n\n if (user?.is_guest) {\n tracking.social.track({\n eventLabel: `source_coming_soon_guest_user`,\n socialAction: 'Like',\n socialNetwork: shadow.SOCIAL_NETWORK.ULULE,\n socialTarget: project.absolute_url,\n })\n } else {\n tracking.social.track({\n eventLabel: `source_coming_soon_known_user`,\n socialAction: 'Like',\n socialNetwork: shadow.SOCIAL_NETWORK.ULULE,\n socialTarget: project.absolute_url,\n })\n }\n\n if (auth.type === 'loggedin-as-guest') {\n // We logout the user here because guest user haven't acces and it makes errors\n // on other pages or on refresh.\n // We just need a logged user for handle like and logout him after it's ok.\n auth.logout()\n }\n }\n}\n\nconst Block = styled.div`\n background-color: ${plume.COLORS.PRIMARY_WHITE};\n border-radius: 4px;\n\n @media screen and ${plume.BREAKPOINTS.LAPTOP} {\n margin-bottom: 30px;\n }\n`\n\nconst CenterSpinner = styled.div`\n align-items: center;\n display: flex;\n justify-content: center;\n min-height: 186px;\n text-align: center;\n width: 100%;\n`\n\nconst HomeWrapper = styled.div<{ iframe: boolean }>`\n padding: 0 16px 16px;\n\n ${({ iframe }) => {\n if (!iframe) {\n return css`\n @media screen and ${plume.BREAKPOINTS.LAPTOP} {\n width: 884px;\n }\n `\n }\n }}\n ${SplashTitle} {\n margin-bottom: 25px;\n }\n\n ${plume.styles.heading.S} {\n margin: 0 auto;\n margin-bottom: 25px;\n text-align: center;\n width: fit-content;\n }\n`\n", "import * as React from 'react'\nimport styled, { css } from 'styled-components'\n\nimport * as plume from '@ulule/owl-kit-components/next'\n\nimport * as api from '@owl-nest/api-client/latest'\nimport * as services from '@owl-nest/services'\nimport { t } from '@owl-nest/localize'\n\ntype LikeProps = {\n onLoggedIn: (user: api.AuthenticatedUser<any>) => void\n onLike: () => void\n}\n\nconst Connect = React.lazy(async () => ({\n default: (await import('@owl-nest/connect')).Connect,\n})) as typeof import('@owl-nest/connect').Connect\n\nexport function Like({ onLoggedIn, onLike }: LikeProps): React.ReactElement<LikeProps> {\n // On utilise une ref ici parce que lorsque les fonctions sont pass\u00E9es \u00E0 Connect\n // elles ne se re-render pas et l'auth n'est plus \u00E0 jour\n // il faut donc forcer l'utilisation du onLoggedIn neuf\n const handlersRef = React.useRef({\n onLoggedIn,\n })\n handlersRef.current = {\n onLoggedIn,\n }\n const auth = services.user.useAuth()\n\n return (\n <Wrapper loggedinUser={auth.type === 'loggedin'}>\n <ConnectWrapper>\n <React.Suspense fallback={<plume.Spinner />}>\n <Connect\n compactMode={true}\n allowGuest={true}\n onGuestLoggedIn={(user) => {\n if (handlersRef.current.onLoggedIn) {\n handlersRef.current.onLoggedIn(user)\n }\n }}\n onLoggedIn={(user) => {\n if (handlersRef.current.onLoggedIn) {\n handlersRef.current.onLoggedIn(user)\n }\n }}\n onSignedUp={(user) => {\n if (handlersRef.current.onLoggedIn) {\n handlersRef.current.onLoggedIn(user)\n }\n }}\n translations={{\n unknownGuestUser: {\n cta: t('Remind me'),\n },\n existingUser: {\n cta: t('Remind me'),\n },\n }}\n />\n </React.Suspense>\n </ConnectWrapper>\n\n {auth.type === 'loggedin' && <plume.Button onClick={onLike}>{t('Remind me')}</plume.Button>}\n </Wrapper>\n )\n}\n\nconst ConnectWrapper = styled.div``\n\nconst Wrapper = styled.div<{ loggedinUser: boolean }>`\n padding: 16px;\n\n @media screen and ${plume.BREAKPOINTS.LAPTOP} {\n padding: 34px;\n }\n\n ${({ loggedinUser }) => {\n if (loggedinUser) {\n return css`\n display: flex;\n flex-direction: column;\n\n ${ConnectWrapper} {\n margin-bottom: 16px;\n }\n\n @media screen and ${plume.BREAKPOINTS.LAPTOP} {\n margin-bottom: 33px;\n flex-direction: row;\n\n ${ConnectWrapper} {\n flex: 2;\n margin-bottom: 0px;\n margin-right: 5px;\n }\n\n ${plume.styles.button.CallToAction} {\n flex: 1;\n }\n }\n `\n }\n }}\n`\n", "import * as React from 'react'\nimport * as Redux from 'react-redux'\nimport styled from 'styled-components'\n\nimport * as model from '@owl-nest/models'\nimport { t, tc } from '@owl-nest/localize'\nimport { UseAuth } from '@owl-nest/redux-wrapper/src/user/identity/useAuth'\n\nimport * as plume from '@ulule/owl-kit-components/next'\n\nimport { RootState } from '../../../../reducers'\nimport * as projectModel from '../../../models/project'\nimport { useSharing } from '@owl-nest/sharing'\n\ntype SuccessMessageProps = {\n auth: UseAuth\n}\n\nexport function SuccessMessage({ auth }: SuccessMessageProps): React.ReactElement<SuccessMessageProps> {\n const project = Redux.useSelector<RootState, projectModel.Project>((state) => state.application.project.data)\n const user = auth.type === 'loggedin' ? auth.user : undefined\n\n const { shareTo } = useSharing<projectModel.ExtraFields>('coming-soon', project, user)\n\n return (\n <Wrapper>\n <plume.illustrations.twoToned.EnvelopeWithHeart size={99} />\n\n <Texts>\n <plume.styles.heading.L>{t('Thank you!')}</plume.styles.heading.L>\n <plume.styles.copy.S>\n {t(\n 'Your registration has been taken into account. You will be notified of the launch and then of the project posts by email.',\n )}\n </plume.styles.copy.S>\n </Texts>\n\n <Share>\n <ShareText>{t('Share the project:')}</ShareText>\n <SocialButtonList>\n <plume.SocialButton platform=\"facebook\" onClick={() => shareTo('facebook')} />\n <plume.SocialButton platform=\"twitter\" onClick={() => shareTo('twitter')} />\n <plume.SocialButton platform=\"messenger\" onClick={() => shareTo('messenger')} />\n </SocialButtonList>\n </Share>\n </Wrapper>\n )\n}\n\nconst SocialButtonList = styled.div`\n margin: 15px 0;\n display: flex;\n flex-direction: row;\n justify-content: center;\n\n ${plume.SocialButton} {\n margin-right: 8px;\n width: 50px;\n height: 50px;\n padding: 15px;\n }\n\n @media screen and ${plume.BREAKPOINTS.TABLET} {\n justify-content: flex-start;\n }\n`\n\nconst Wrapper = styled.div`\n align-items: flex-start;\n display: flex;\n padding: 42px 35px;\n flex-direction: column;\n\n @media screen and ${plume.BREAKPOINTS.TABLET} {\n align-items: center;\n flex-direction: row;\n justify-content: space-between;\n }\n`\n\nconst ShareText = styled(plume.styles.copy.S)`\n margin-bottom: 11px;\n`\n\nconst Texts = styled.div`\n border-bottom: 1px solid ${plume.COLORS.GREY_SHADE_5};\n padding-bottom: 11px;\n margin-top: 10px;\n\n ${plume.styles.heading.L} {\n margin-bottom: 16px;\n }\n\n @media screen and ${plume.BREAKPOINTS.TABLET} {\n border-bottom: 0px solid;\n border-right: 1px solid ${plume.COLORS.GREY_SHADE_5};\n margin-left: 45px;\n margin-top: 0px;\n padding-bottom: 0px;\n padding-right: 18px;\n width: 460px;\n\n ${plume.styles.heading.L} {\n margin-bottom: 22px;\n }\n }\n`\n\nconst Share = styled.div`\n margin-top: 14px;\n text-align: center;\n width: 100%;\n\n @media screen and ${plume.BREAKPOINTS.TABLET} {\n margin-left: 37px;\n margin-top: 0px;\n text-align: left;\n width: 166px;\n }\n`\n", "import * as React from 'react'\nimport styled from 'styled-components'\n\nimport * as plume from '@ulule/owl-kit-components/next'\n\ntype SplashTitleProps = React.HtmlHTMLAttributes<HTMLDivElement> & {\n text: string\n}\n\nfunction SplashTitleComponent(props: SplashTitleProps): React.ReactElement<SplashTitleProps> {\n return <plume.styles.heading.S {...props}>{props.text}</plume.styles.heading.S>\n}\n\nexport const SplashTitle = styled(SplashTitleComponent)`\n background-color: ${plume.COLORS.BLUE_SHADE_2};\n color: ${plume.COLORS.PRIMARY_WHITE};\n display: inline-block;\n font-weight: 700; // HACK: Irregular font manipulation\n line-height: 1.5;\n padding: 0px 10px;\n transform: rotate(-4deg);\n`\n", "import * as React from 'react'\nimport styled from 'styled-components'\n\nimport { t } from '@ulule/localize'\nimport * as plume from '@ulule/owl-kit-components/next'\n\nexport function Title(): React.ReactElement<unknown> {\n return (\n <Wrapper>\n <plume.styles.heading.S>{t('Be among the first to support this project \uD83D\uDC47')}</plume.styles.heading.S>\n <plume.styles.heading.L>{t('Be among the first to support this project \uD83D\uDC47')}</plume.styles.heading.L>\n </Wrapper>\n )\n}\n\nconst Wrapper = styled.div`\n text-align: center;\n\n ${plume.styles.heading.L} {\n display: none;\n }\n\n @media screen and ${plume.BREAKPOINTS.LAPTOP} {\n ${plume.styles.heading.S} {\n display: none;\n }\n\n ${plume.styles.heading.L} {\n display: block;\n margin-bottom: 25px;\n }\n }\n`\n", "import * as React from 'react'\nimport * as Redux from 'react-redux'\nimport styled, { css } from 'styled-components'\n\nimport * as consent from '@owl-nest/consent'\nimport { t } from '@owl-nest/localize'\nimport * as model from '@owl-nest/models'\n\nimport * as plume from '@ulule/owl-kit-components/next'\n\nimport * as UFE from '../../../UFE'\nimport { RootState } from '../../../reducers'\nimport * as projectModel from '../../models/project'\nimport { SplashTitle } from './components/SplashTitle'\n\ntype ContextProps = {\n iframe: boolean\n}\n\nexport function Context({ iframe }: ContextProps): React.ReactElement<ContextProps> {\n const project = Redux.useSelector<RootState, projectModel.Project>((state) => state.application.project.data)\n\n const title = model.project.name<projectModel.ExtraFields>(project)\n const subtitle = model.project.subtitle<projectModel.ExtraFields>(project)\n const mainImage = model.project.mainImage<projectModel.ExtraFields>(project)\n const video = model.project.video<projectModel.ExtraFields>(project)\n\n return (\n <ContextWrapper iframe={iframe} hasVideo={video !== undefined}>\n <Information>\n <SplashTitle text={t('Coming soon!')} />\n\n <plume.styles.heading.L>{title || t('something very cool')}</plume.styles.heading.L>\n <plume.styles.heading.XL>{title || t('something very cool')}</plume.styles.heading.XL>\n\n {subtitle && <plume.styles.copy.M>{subtitle}</plume.styles.copy.M>}\n </Information>\n\n {video && (\n <ProjectVideoContainer>\n <ProjectVideo\n consentWall={consent.media.Wall}\n placeholder={mainImage ?? video?.thumbnail_url}\n srcSet={mainImage ?? video?.thumbnail_url}\n videoHtml={video.html}\n />\n </ProjectVideoContainer>\n )}\n {!video && mainImage && <ProjectImage src={mainImage} />}\n </ContextWrapper>\n )\n}\n\nconst ProjectImage = styled.img`\n border-radius: 4px;\n display: block;\n height: 100%;\n width: 97%;\n aspect-ratio: 30 / 17;\n object-fit: cover;\n margin-left: 8px;\n\n @media screen and ${plume.BREAKPOINTS.TABLET} {\n width: 50%;\n }\n\n @media screen and ${plume.BREAKPOINTS.LAPTOP} {\n max-width: 460px;\n margin-left: 16px;\n width: 100%;\n box-shadow: ${plume.COLORS.PRIMARY_WHITE} -16px 16px 0px;\n }\n\n @media screen and ${plume.BREAKPOINTS.LAPTOP_L} {\n max-width: 600px;\n }\n`\n\nconst ProjectVideo = styled(plume.VideoLoader)`\n display: block;\n width: 100%;\n`\n\nconst ProjectVideoContainer = styled.div`\n position: relative;\n overflow: hidden;\n border-radius: 4px;\n height: fit-content;\n width: 100%;\n\n img {\n aspect-ratio: 30 / 17;\n }\n\n @media screen and ${plume.BREAKPOINTS.TABLET} {\n width: 50%;\n }\n\n @media screen and ${plume.BREAKPOINTS.LAPTOP} {\n width: 460px;\n margin-left: 16px;\n box-shadow: ${plume.COLORS.PRIMARY_WHITE} -16px 16px 0px;\n }\n\n @media screen and ${plume.BREAKPOINTS.LAPTOP_L} {\n width: 600px;\n }\n`\n\nconst Information = styled.div`\n margin-bottom: 20px;\n min-width: 260px;\n\n @media screen and ${plume.BREAKPOINTS.TABLET} {\n margin-right: 15px;\n }\n\n @media screen and ${plume.BREAKPOINTS.LAPTOP} {\n margin-bottom: 0px;\n max-width: 400px;\n margin-right: 35px;\n }\n`\n\nconst ContextWrapper = styled.div<{ iframe: boolean; hasVideo: boolean }>`\n padding: 16px;\n\n ${plume.styles.copy.M} {\n margin-top: 8px;\n }\n\n ${plume.styles.heading.XL} {\n display: none;\n }\n\n ${SplashTitle} {\n display: block;\n margin: 10px auto 25px auto;\n width: fit-content;\n }\n\n ${({ iframe, hasVideo }) => {\n if (iframe && hasVideo) {\n return css`\n min-width: 630px;\n `\n }\n }}\n\n ${({ iframe }) => {\n if (iframe) {\n return css`\n ${Information} {\n max-width: 460px;\n\n @media screen and ${plume.BREAKPOINTS.LAPTOP} {\n min-width: 460px;\n }\n }\n `\n }\n }};\n\n @media not screen and ${plume.BREAKPOINTS.LAPTOP} {\n align-items: center;\n }\n\n @media screen and ${plume.BREAKPOINTS.TABLET} {\n display: flex;\n justify-content: space-between;\n padding: 20px;\n }\n\n @media screen and ${plume.BREAKPOINTS.LAPTOP} {\n max-width: 1210px;\n margin: 0px;\n margin-top: 60px;\n margin-bottom: 60px;\n position: relative;\n background-image: url('${UFE.IMAGES.comingSoonBackground}');\n\n ${SplashTitle} {\n position: absolute;\n top: 10px;\n }\n\n ${plume.styles.heading.L} {\n display: none;\n }\n\n ${plume.styles.heading.XL} {\n display: block;\n margin-top: 40px;\n margin-bottom: 16px;\n }\n }\n\n @media screen and ${plume.BREAKPOINTS.LAPTOP} {\n padding: 60px 90px 0px;\n }\n`\n", "import * as React from 'react'\nimport * as Redux from 'react-redux'\nimport styled from 'styled-components'\n\nimport * as plume from '@ulule/owl-kit-components/next'\n\nimport * as model from '@owl-nest/models'\n\nimport { RootState } from '../../../../reducers'\nimport * as projectModel from '../../../models/project'\n\nexport function ComingSoonHeader(): React.ReactElement<unknown> {\n const project = Redux.useSelector<RootState, projectModel.Project>((state) => state.application.project.data)\n\n return (\n <Wrapper>\n <Owner href={project.owner.absolute_url}>\n <plume.styles.image.Avatar src={model.user.avatar(project.owner, '90x90')} alt=\"\" />\n <plume.styles.heading.XS>{model.user.username(project.owner)}</plume.styles.heading.XS>\n </Owner>\n\n <plume.glyphs.stroke.Close size={22} />\n <a href=\"/\">\n <plume.logos.ulule.HorizontalLogo />\n </a>\n </Wrapper>\n )\n}\n\nconst Owner = styled.a`\n align-items: center;\n display: flex;\n justify-content: center;\n margin-bottom: 5px;\n text-decoration: none;\n`\n\nconst Wrapper = styled.div`\n align-content: center;\n align-items: center;\n display: flex;\n flex-wrap: wrap;\n justify-content: center;\n margin: 0 16px;\n padding-bottom: 20px;\n padding-top: 26px;\n\n ${plume.glyphs.stroke.Close} {\n color: ${plume.COLORS.GREY_SHADE_4};\n margin: 0 22px;\n }\n\n ${plume.styles.heading.XS} {\n margin-left: 6px;\n width: 70%;\n }\n\n @media screen and ${plume.BREAKPOINTS.TABLET} {\n ${plume.styles.heading.XS} {\n margin-left: 6px;\n width: 100%;\n }\n }\n`\n", "import * as React from 'react'\nimport styled from 'styled-components'\n\nimport { COLORS } from '@ulule/owl-kit-components/next'\n\ntype BrowserScreenshotProps = {\n className?: string\n ratio?: number\n children: React.ReactNode\n href?: string\n}\n\nfunction BrowserScreenshotComponent({\n className,\n ratio = 16 / 9,\n children,\n href,\n}: BrowserScreenshotProps): React.ReactElement<BrowserScreenshotProps> {\n return (\n <Wrapper className={className}>\n <RatioPreserver ratio={ratio}>\n <BrowserWrapper>\n <BrowserBar>\n <Button type=\"close\" />\n <Button type=\"minimise\" />\n <Button type=\"maximise\" />\n <NavigationBar>{href}</NavigationBar>\n </BrowserBar>\n {children}\n </BrowserWrapper>\n </RatioPreserver>\n </Wrapper>\n )\n}\n\nconst buttonColors = { close: '#FF605C', minimise: '#FFBD44', maximise: '#00CA4E' } as const\nconst Button = styled.div<{ type: 'close' | 'minimise' | 'maximise' }>`\n width: 3px;\n height: 3px;\n border-radius: 50%;\n background-color: ${({ type }) => COLORS.hexToRgb(buttonColors[type], 0.8)};\n border: 1px solid ${({ type }) => buttonColors[type]};\n`\n\nconst NavigationBar = styled.div`\n background-color: white;\n border: 1px solid #d0d1d1;\n flex: 1;\n border-radius: 2px;\n margin: 0 10px 0 20px;\n height: 10px;\n font-size: 7px;\n line-height: 10px;\n padding: 0 10px;\n color: #444;\n`\n\nconst BrowserBar = styled.div`\n position: relative;\n background-color: #e0dddd;\n display: flex;\n padding: 4px;\n z-index: 1;\n\n ${Button} {\n margin: 2px;\n }\n`\n\nconst BrowserWrapper = styled.div`\n pointer-events: none;\n user-select: none;\n border: 1px solid #e0dddd;\n`\n\nconst RatioPreserver = styled.div<{ ratio: number }>`\n position: relative;\n padding-bottom: ${({ ratio }) => (1 / ratio) * 100}%;\n\n ${BrowserWrapper} {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n overflow: hidden;\n }\n`\n\nconst Wrapper = styled.div``\n\nexport const BrowserScreenshot = styled(BrowserScreenshotComponent)``\n", "import * as React from 'react'\nimport * as Redux from 'react-redux'\n\nimport styled, { css } from 'styled-components'\n\nimport { useAuth } from '@owl-nest/redux-wrapper/hooks'\nimport * as api from '@owl-nest/api-client/latest'\nimport { t } from '@owl-nest/localize'\nimport * as model from '@owl-nest/models'\nimport { SearchQualifier } from '@owl-nest/api-client/latest'\nimport { QueryStatus, useQuery } from '@owl-nest/hooks'\n\nimport { BREAKPOINTS, Spinner, styles as S } from '@ulule/owl-kit-components/next'\n\nimport * as projectModel from '../../../models/project'\nimport { RootState } from '../../../../reducers'\nimport { SuggestedProject } from './SuggestedProject'\n\ntype SuggestedProjectsListProps = {\n isEditMode: boolean\n}\n\nexport function SuggestedProjectsList({ isEditMode }: SuggestedProjectsListProps): React.ReactElement<unknown> {\n const auth = useAuth()\n\n const project = Redux.useSelector<RootState, projectModel.Project>((state) => state.application.project.data)\n const userIsAuthenticated = auth.type === 'loggedin'\n\n const breakpoint = isEditMode ? BREAKPOINTS.LAPTOP_L : BREAKPOINTS.LAPTOP\n\n const querySearch = getQuerySearch({\n search: '',\n qualifiers: {\n sort: 'popular',\n tag_id: project?.main_tag?.id,\n status: 'currently',\n },\n params: { limit: 8 },\n withAccessToken: userIsAuthenticated,\n })\n\n const [query, response] = useQuery(async () => {\n const result = await api.api.get.search({\n getParams: querySearch.toString(),\n withToken: userIsAuthenticated,\n })\n return result.next((success) => success.body)\n })\n\n if (response.status === QueryStatus.PRISTINE) {\n query()\n }\n\n if (response.status !== QueryStatus.SUCCESS) {\n return (\n <Content breakpoint={breakpoint}>\n <Spinner />\n </Content>\n )\n }\n\n return (\n <Content breakpoint={breakpoint}>\n <S.heading.M>\n {t('Discover more %(mainTag)s live projects', {\n mainTag: model.project.mainTag<projectModel.ExtraFields>(project)?.toLowerCase(),\n })}\n </S.heading.M>\n <ProjectListItems breakpoint={breakpoint}>\n {response.data.projects?.map((suggestedProject) => {\n return <SuggestedProject key={suggestedProject.id} project={suggestedProject} />\n })}\n </ProjectListItems>\n <Center>\n <S.button.Button as=\"a\" href={project?.main_tag?.absolute_url} kind=\"secondary\">\n {t('See more')}\n </S.button.Button>\n </Center>\n </Content>\n )\n}\n\nconst Content = styled.div<{ breakpoint: string }>`\n padding-top: 35px;\n\n ${S.heading.M} {\n text-align: center;\n margin: 0 20px;\n }\n\n ${SuggestedProject} {\n margin: 20px;\n width: 100%;\n }\n\n ${({ breakpoint }) => {\n return css`\n @media screen and ${breakpoint} {\n align-items: center;\n display: flex;\n flex-direction: column;\n justify-content: center;\n margin: 0 auto;\n\n ${S.heading.M} {\n margin: 0;\n }\n\n ${SuggestedProject} {\n margin: 0;\n width: auto;\n }\n }\n `\n }}\n`\n\nconst Center = styled.div`\n text-align: center;\n`\n\nconst ProjectListItems = styled.div<{ breakpoint: string }>`\n display: flex;\n flex-wrap: wrap;\n margin-top: 5px;\n padding-bottom: 40px;\n padding-top: 25px;\n justify-content: space-around;\n\n ${({ breakpoint }) => {\n return css`\n @media screen and ${breakpoint} {\n align-items: initial;\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n grid-gap: 25px;\n grid-auto-rows: minmax(100px, auto);\n margin: 50px;\n margin-bottom: 0px;\n }\n `\n }}\n`\n\nconst projectSearchExtraFields = {\n guests: ['main_image', 'main_tag', 'owner', 'partnerships', 'avatar_image'],\n users: ['user_role', 'main_image', 'main_tag', 'owner', 'partnerships', 'avatar_image'],\n}\n\ntype GetQuerySearchProps = {\n search: string\n qualifiers: SearchQualifier\n params: { [s: string]: boolean | number | string }\n withAccessToken: boolean\n}\n\nexport const getQuerySearch = ({\n search = '',\n qualifiers = {},\n params,\n withAccessToken,\n}: GetQuerySearchProps): URLSearchParams => {\n const extraFields = withAccessToken ? projectSearchExtraFields.users : projectSearchExtraFields.guests\n const paramsUrl = new URLSearchParams()\n const request = search ? `${search} ${stringifyQualifiers(qualifiers)}` : `${stringifyQualifiers(qualifiers)}`\n paramsUrl.append('q', request)\n paramsUrl.append('extra_fields', extraFields.join(','))\n\n Object.keys(params).map((name) => {\n paramsUrl.append(name, params[name].toString())\n })\n\n return paramsUrl\n}\n\nfunction stringifyQualifiers(qualifiers: SearchQualifier): string {\n return Object.entries(qualifiers)\n .map(([key, value]) => {\n if (Array.isArray(value)) {\n return (value as []).map((value: string) => `${key}:${value}`).join(' ')\n } else {\n return `${key}:${value}`\n }\n })\n .join(' ')\n}\n", "import * as React from 'react'\nimport * as Redux from 'react-redux'\n\nimport styled from 'styled-components'\n\nimport * as api from '@owl-nest/api-client/latest'\nimport { t, tn } from '@owl-nest/localize'\nimport * as model from '@owl-nest/models'\nimport { useAuth } from '@owl-nest/redux-wrapper/hooks'\nimport { text } from '@owl-nest/utils'\nimport * as duvet from '@ulule/duvet'\nimport * as hooks from '@owl-nest/hooks'\nimport * as env from '@owl-nest/config'\n\nimport * as modalAction from '../../../../actions/modal'\n\nimport { useProjectFollowing } from '../hooks/useProjectFollowing'\n\nimport * as UFE from '../../../../UFE'\n\ntype SuggestedProjectProps = {\n project: api.Project\n className?: string\n}\n\ntype Action = {\n isCompact: boolean\n text: string\n icon: 'inactive-heart' | 'active-heart' | 'created' | 'backed'\n onClick?: (event: React.MouseEvent<HTMLButtonElement>) => void\n}\n\nfunction SuggestedProjectComponent({\n project,\n className,\n}: SuggestedProjectProps): React.ReactElement<SuggestedProjectProps> {\n const dispatch = Redux.useDispatch()\n const isProjectFinished = model.project.isFinished(project)\n const textFinishProject =\n isProjectFinished && project.date_end ? model.project.getFinishedLabel(project.date_end) : t('Finished')\n const [userFollowsProject, setUserFollowsProject] = React.useState(project?.user_role === api.UserRole.Fan)\n const followingStatusRef = React.useRef(true)\n const shortCountdown =\n project.date_end &&\n hooks.useDateCountdown(new Date(project.date_end), { automaticRefresh: true, shortLabels: true })\n\n const toggleFollowing = useProjectFollowing({\n callback: () => {\n setUserFollowsProject(!userFollowsProject)\n },\n project,\n userFollowsProject,\n })\n\n const action = getAction(project, toggleFollowing, userFollowsProject)\n\n const userCurrency = env.getUserConfig().currency\n\n React.useEffect(() => {\n if (!followingStatusRef.current && userFollowsProject) {\n dispatch(modalAction.toggleModalFollow(true))\n } else followingStatusRef.current = userFollowsProject\n }, [userFollowsProject])\n\n return (\n <duvet.CardTypeSelector\n cardType=\"classic\"\n action={action}\n className={className}\n project={project}\n rates={env.CURRENCIES_RATES}\n targetCurrency={userCurrency}\n projectTranslation={{\n addToMyList: t('Add to my list'),\n listed: t('Listed'),\n backerCount: tn(\n '%s contribution',\n '%s contributions',\n project.orders_count || 0,\n text.numberToLocaleString(project.orders_count || project.supporters_count),\n ),\n comingSoon: model.project.comingSoonLabel(project, Boolean(UFE.CURRENT_USER.is_staff)),\n extraTime: t('Extension'),\n finished: textFinishProject,\n highlights: t('Highlights'),\n progressInfo: t('%(percent)s reached', {\n percent: `${text.numberToLocaleString(model.project.progress(project))}%`,\n }),\n shortCountdown: `${shortCountdown ? shortCountdown.label : ''}`,\n status: model.project.getStatus(project) ?? (shortCountdown ? shortCountdown.label : undefined),\n }}\n />\n )\n}\n\nexport const SuggestedProject = styled(SuggestedProjectComponent)``\n\nfunction getAction(project: api.Project, toggleFollowing: () => void, userFollowsProject: boolean): Action {\n const auth = useAuth()\n const isUserLoggedin = auth.type === 'loggedin'\n const dispatch = Redux.useDispatch()\n\n if (\n project?.user_role === api.UserRole.Owner ||\n project?.user_role === api.UserRole.Moderator ||\n project?.user_role === api.UserRole.Editor\n ) {\n return {\n isCompact: true,\n text: t('Created'),\n icon: 'created',\n }\n }\n\n if (project?.user_role === api.UserRole.Supporter) {\n return {\n isCompact: true,\n text: t('Backed'),\n icon: 'backed',\n }\n }\n return {\n isCompact: true,\n text: userFollowsProject ? t('Listed') : t('Add to my list'),\n icon: userFollowsProject ? 'active-heart' : 'inactive-heart',\n onClick: (event: React.MouseEvent<HTMLButtonElement>) => {\n event.preventDefault()\n if (isUserLoggedin) {\n toggleFollowing()\n } else {\n dispatch(modalAction.toggleModalFollow(true))\n }\n },\n }\n}\n", "import * as React from 'react'\nimport * as Redux from 'react-redux'\nimport styled from 'styled-components'\nimport { Navigate, Route, Routes, useParams, useLocation } from 'react-router-dom'\n\nimport * as models from '@owl-nest/models'\n\nimport { Spinner } from '@ulule/owl-kit-components/next'\n\nimport { useHashRouting, useNavigation } from './hooks/useNavigation'\nimport * as projectModel from './models/project'\nimport { PATHS } from './paths'\nimport { RootState } from '../reducers'\n\nimport { BackersTab } from './views/detail/tabs/backers'\n\nimport * as UFE from '../UFE'\n\nconst CommentsTab = React.lazy(async () => ({ default: (await import('./views/detail/tabs/comments')).CommentsTab }))\nconst FAQTab = React.lazy(async () => ({ default: (await import('./views/detail/tabs/faq')).FAQTab }))\nconst NewsTab = React.lazy(async () => ({ default: (await import('./views/detail/tabs/news')).NewsTab }))\nconst ProjectTab = React.lazy(async () => ({ default: (await import('./views/detail/tabs/project')).ProjectTab }))\nconst RewardsTab = React.lazy(async () => ({ default: (await import('./views/detail/tabs/rewards')).RewardsTab }))\nconst NewsPermalink = React.lazy(async () => ({\n default: (await import('./views/detail/tabs/news/NewsPermalink')).NewsPermalink,\n}))\n\nexport function TabRouter(): React.ReactElement {\n useHashRouting()\n const navigation = useNavigation()\n\n return (\n <React.Suspense\n fallback={\n <SpinnerContainer style={{ minHeight: `${'800'}px`, display: 'block', margin: 'auto', maxWidth: '300px' }}>\n <Spinner />\n </SpinnerContainer>\n }\n >\n <Routes>\n <Route path={navigation.pathTo(PATHS.PROJECT).pathname} element={<HashRouter />} />\n <Route\n path={navigation.pathTo({ path: PATHS.NEWS_PERMALINK, params: { slug: ':slug' } }).pathname}\n element={<NewPermalinkView />}\n />\n <Route path={navigation.pathTo(PATHS.NEWS).pathname} element={<NewsTab />} />\n <Route path={navigation.pathTo(PATHS.SUPPORTERS).pathname} element={<BackersTab />} />\n\n <Route element={<Navigate to={navigation.pathTo(PATHS.PROJECT).pathname} />} />\n </Routes>\n </React.Suspense>\n )\n}\n\nconst SpinnerContainer = styled.div`\n min-height: 800px;\n margin: auto;\n max-width: 300px;\n`\n\nfunction HashRouter(): React.ReactElement {\n const location = useLocation()\n const project = Redux.useSelector<RootState, projectModel.Project>((state) => state.application.project.data)\n\n if (location.hash.includes('#comments')) {\n return <CommentsTab />\n } else if (location.hash.includes('#faq')) {\n return <FAQTab />\n // HACK: The check for donation-based campaigns is quick'n'dirty.\n // We should straightaway not register the excluded routes.\n } else if (location.hash.includes('#rewards') && !models.project.isDonationBased(project)) {\n return <RewardsTab />\n }\n\n return <ProjectTab />\n}\n\nfunction NewPermalinkView(): React.ReactElement {\n const { slug } = useParams()\n const fragments = slug!.split('-')\n const id = Number(fragments[fragments.length - 1])\n // TODO: investigate why UFE.NEWS is not correctly typed\n return <NewsPermalink news={UFE.NEWS as any} id={id} />\n}\n", "import * as React from 'react'\nimport * as Redux from 'react-redux'\nimport styled from 'styled-components'\n\nimport { t, tn } from '@owl-nest/localize'\nimport * as models from '@owl-nest/models'\nimport * as hooks from '@owl-nest/hooks'\nimport { Status } from '@owl-nest/redux-wrapper'\nimport * as service from '@owl-nest/services'\nimport * as api from '@owl-nest/api-client/latest'\nimport { BREAKPOINTS, Button, styles as S } from '@ulule/owl-kit-components/next'\n\nimport { loadProjectFans } from '../../../../../actions/fandom'\nimport * as fanModel from '../../../../models/fan'\nimport { RootState, AppState } from '../../../../../reducers'\nimport { useListLoadingIndicator } from '../../hooks/useListLoadingIndicator'\n\nimport { Backer } from '../../components/Backer'\nimport { SidebarNewsCTA, SidebarRewardsCTA } from '../../components/Sidebar'\nimport { Follower } from './Follower'\nimport { Sponsor } from './Sponsor'\n\nimport { DisplayMode } from '../../../../context'\nimport * as Styles from '../../style'\nimport { TRACKING_SOURCE } from '../../utils/trackerEnums'\n\nimport type { ExtraFields } from '../../../../models/project'\n\nexport function BackersTab(): React.ReactElement<unknown> {\n const dispatch = Redux.useDispatch()\n const { fandom, project } = Redux.useSelector<RootState, AppState>((state) => state.application)\n const { orders_count: ordersCount, supporters_count: supportersCount, sponsorships } = project.data\n const fansCount = fandom.count\n\n const isEditMode = React.useContext(DisplayMode) === 'edit'\n\n const [isLoadingFans, markLoadingStartFans] = useListLoadingIndicator(fandom.fans.length)\n\n const loadMoreFans = (): void => {\n if (fandom.next) {\n dispatch(loadProjectFans(project.data.id, { pagination: fandom.next, extraFields: [...fanModel.extraFields] }))\n markLoadingStartFans()\n }\n }\n\n React.useEffect(() => {\n if (fandom.status.load === Status.PRISTINE) {\n dispatch(\n loadProjectFans(project.data.id, {\n pagination: '?limit=9',\n extraFields: [...fanModel.extraFields],\n forceClean: true,\n }),\n )\n }\n }, [])\n\n return (\n <Wrapper>\n <Styles.Main isEditMode={isEditMode}>\n <Styles.Wrapper isEditMode={isEditMode}>\n <Styles.Content isEditMode={isEditMode}>\n <S.heading.M>\n {tn(\n '%(ordersCount)d contribution to this project',\n '%(ordersCount)s contributions to this project',\n ordersCount || supportersCount,\n { ordersCount: ordersCount || supportersCount },\n )}\n </S.heading.M>\n {sponsorships?.map((sponsorship, i) => {\n if (sponsorship.amount === 0) return\n return <Sponsor key={i} sponsorship={sponsorship} project={project.data} />\n })}\n <ProjectOrderList />\n </Styles.Content>\n <Styles.Sidebar isEditMode={isEditMode}>\n {!models.project.isDonationBased(project.data) && <SidebarRewardsCTA />}\n <SidebarNewsCTA source={TRACKING_SOURCE.BACKERS} />\n </Styles.Sidebar>\n </Styles.Wrapper>\n </Styles.Main>\n <Styles.Main>\n <Styles.Wrapper>\n <FollowerContainer>\n <S.heading.M>\n {tn(\n '%(fansCount)d person is following this project',\n '%(fansCount)d people are following this project',\n fansCount,\n { fansCount },\n )}\n </S.heading.M>\n <Columns>\n {fandom?.fans.map((follower, i) => {\n return <Follower key={i} follower={follower} project={project.data} />\n })}\n </Columns>\n {fandom?.next && (\n <ShowMoreContainer>\n <Button loading={isLoadingFans} kind=\"secondary\" onClick={() => loadMoreFans()}>\n {t('See more')}\n </Button>\n </ShowMoreContainer>\n )}\n </FollowerContainer>\n </Styles.Wrapper>\n </Styles.Main>\n </Wrapper>\n )\n}\n\nfunction ProjectOrderList() {\n const { project } = Redux.useSelector<RootState, AppState>((state) => state.application)\n\n const useProjectOrder = service.order.useProjectOrders(project.data.id, {\n params: {\n limit: 10,\n extraFields: ['latest_user_project_comment'],\n },\n fetchOnMount: true,\n })\n const orderPageList = hooks.data(useProjectOrder.response)\n\n return (\n <>\n {orderPageList?.map((page) => {\n return page.orders.map((order) => {\n return (\n order.user && (\n <Backer\n key={order.id}\n supporter={{\n ...order.user,\n latest_project_comment: order.latest_user_project_comment ?? order.user.latest_project_comment,\n latest_project_order: order as api.Order,\n }}\n project={project.data}\n source={TRACKING_SOURCE.BACKERS}\n />\n )\n )\n })\n })}\n {useProjectOrder.meta?.next && (\n <ShowMoreContainer>\n <Button\n kind=\"secondary\"\n loading={useProjectOrder.response.status === hooks.QueryStatus.PENDING}\n onClick={() => useProjectOrder.queryNext()}\n >\n {t('See more')}\n </Button>\n </ShowMoreContainer>\n )}\n </>\n )\n}\n\nconst Wrapper = styled.div`\n padding: 1px 0;\n\n ${S.heading.M} {\n display: block;\n margin-bottom: 25px;\n }\n\n ${Styles.Content} {\n padding: 0 10px 1px;\n width: 100%;\n }\n\n @media not screen and ${BREAKPOINTS.MOBILE_L} {\n ${Styles.Wrapper} {\n padding: 0;\n }\n\n ${Styles.Content} {\n padding: 0;\n\n ${S.heading.M} {\n margin: 0 20px 25px;\n }\n }\n }\n\n @media screen and ${BREAKPOINTS.LAPTOP} {\n ${S.heading.M} {\n margin-bottom: 40px;\n }\n }\n`\n\nconst ShowMoreContainer = styled.div`\n display: flex;\n justify-content: center;\n align-items: center;\n align-content: center;\n padding: 20px 0 0;\n\n @media not screen and ${BREAKPOINTS.MOBILE_L} {\n padding-bottom: 0;\n\n ${S.button.Button} {\n margin-left: 10px;\n margin-right: 10px;\n width: 100%;\n }\n }\n`\n\nconst FollowerContainer = styled.div`\n flex-grow: 1;\n padding: 0 10px;\n\n @media not screen and ${BREAKPOINTS.MOBILE_L} {\n ${S.heading.M} {\n padding: 0 10px;\n }\n }\n`\n\nconst Columns = styled.div`\n display: block;\n flex-wrap: wrap;\n\n & > div {\n flex: 0 0 33.3333%;\n box-sizing: border-box;\n }\n\n @media screen and ${BREAKPOINTS.LAPTOP} {\n display: flex;\n }\n`\n", "import * as api from '@owl-nest/api-client/latest'\n\nexport const extraFields = ['labels'] as const\n\nexport type ExtraFields = (typeof extraFields)[number]\n\nexport type Fan = api.Fan<ExtraFields>\n", "import * as React from 'react'\nimport * as Redux from 'react-redux'\nimport styled, { css } from 'styled-components'\n\nimport * as plume from '@ulule/owl-kit-components/next'\nimport { t, tc } from '@owl-nest/localize'\nimport * as date from '@owl-nest/date'\nimport * as api from '@owl-nest/api-client/latest'\nimport { CATEGORY, EVENT_TYPE, useTracking } from '@owl-nest/shadow'\nimport * as model from '@owl-nest/models'\n\nimport * as styles from '../style'\n\nimport * as modalAction from '../../../../actions/modal'\nimport { Supporter } from '../../../models/supporter'\nimport * as projectModel from '../../../models/project'\nimport { formatBacker } from '../utils/formatBacker'\nimport { TRACKING_ACTION, TRACKING_SOURCE } from '../utils/trackerEnums'\nimport * as URLs from '../../../utils/URLs'\n\ntype BackerPropTypes = {\n supporter: api.Supporter\n project: projectModel.Project\n variant?: string\n source: TRACKING_SOURCE\n}\n\nexport function Backer({ supporter, project, variant, source }: BackerPropTypes): React.ReactElement<BackerPropTypes> {\n const { dateOrder, labelColor, labelName } = formatBacker(supporter, project)\n\n const isOwnerComment = supporter.id === project.owner.id\n\n const hasComment = !isOwnerComment && supporter.latest_project_comment && supporter.latest_project_comment?.is_public\n\n return (\n <styles.BackerContainer variant={variant}>\n {/* Avatar */}\n <styles.Avatar href={supporter.absolute_url} variant={variant}>\n <plume.styles.image.Avatar src={model.user.avatar(supporter, '55x55')} type=\"medium\" />\n </styles.Avatar>\n <BackerInfo variant={variant}>\n <CopyWrapper hasComment={hasComment}>\n <div>\n <Copy>\n {/* Name */}\n {supporter.is_anonymous ? (\n <plume.styles.heading.XS as=\"span\">{t('Anonymous backer')}</plume.styles.heading.XS>\n ) : (\n <plume.styles.heading.XS as=\"a\" href={supporter.absolute_url}>\n {model.user.fullName(supporter)}\n </plume.styles.heading.XS>\n )}\n {/* Label */}\n {labelName && (\n <plume.RoleTag forwardedAs=\"span\" backgroundColor={labelColor}>\n {labelName}\n </plume.RoleTag>\n )}\n </Copy>\n <plume.styles.copy.M as=\"span\">\n {project.type === api.ProjectType.Donation ? (\n <DonationBasedContent project={project} supporter={supporter} />\n ) : (\n <RewardBasedContent project={project} source={source} supporter={supporter} />\n )}\n </plume.styles.copy.M>\n </div>\n {/* Comments */}\n {hasComment && <CommentWrapper>{supporter.latest_project_comment?.comment}</CommentWrapper>}\n </CopyWrapper>\n {/* Last contribution date */}\n {dateOrder && (\n <DateInfo hasComment={hasComment}>{date.formatDistanceToNow(dateOrder, { includeSeconds: true })}</DateInfo>\n )}\n </BackerInfo>\n </styles.BackerContainer>\n )\n}\nexport function DonationBasedContent({ supporter, project }: Omit<BackerPropTypes, 'source'>) {\n const { supporterLatestOrder } = formatBacker(supporter, project)\n\n return (\n <>\n {supporterLatestOrder?.type === 'monthly'\n ? tc('made a [Link: monthly donation of %(price)s]', {\n Link: (\n <plume.Link\n tinted\n href={\n model.project.isOrdersEnabled<projectModel.ExtraFields>(project)\n ? URLs.getCheckoutURL(project.id)\n : ''\n }\n />\n ),\n price: plume.accounting.localeMoney(supporterLatestOrder?.order_total, {\n currency: project.currency,\n lang: project.lang,\n }),\n })\n : tc('made a [Link: donation of %(price)s]', {\n Link: (\n <plume.Link\n tinted\n href={\n model.project.isOrdersEnabled<projectModel.ExtraFields>(project)\n ? URLs.getCheckoutURL(project.id)\n : ''\n }\n />\n ),\n price: plume.accounting.localeMoney(supporterLatestOrder?.order_total, {\n currency: project.currency,\n lang: project.lang,\n }),\n })}\n </>\n )\n}\n\nexport function RewardBasedContent({ supporter, project, source }: BackerPropTypes) {\n const dispatch = Redux.useDispatch()\n\n const tracking = useTracking()\n\n const postCampaignLink = project?.post_campaign_link\n\n const { isLegacy, isHidden, hasTip, firstReward, supporterLatestOrder } = formatBacker(supporter, project)\n\n function rewardContent() {\n if (firstReward) {\n if (isHidden) {\n return t('supports this project')\n }\n\n if (isLegacy) {\n if (hasTip && supporterLatestOrder?.tip) {\n return tc('supports this project with [price]', {\n price: (\n <plume.LocaleMoneyDisplayer\n amount={supporterLatestOrder?.tip + firstReward.price}\n currency={project.currency}\n localeFormat={project.lang}\n />\n ),\n })\n }\n return tc('supports this project with [price]', {\n price: (\n <plume.LocaleMoneyDisplayer\n amount={firstReward.price}\n currency={project.currency}\n localeFormat={project.lang}\n />\n ),\n })\n }\n\n if (supporterLatestOrder?.items && supporterLatestOrder?.items.length > 1) {\n return t('chose %(nb)s rewards', { nb: supporterLatestOrder.items.length })\n }\n\n return tc('chose the reward [link: %(reward)s]', {\n link: (\n <plume.Link\n tinted\n onClick={() => {\n if (model.project.isFinished<projectModel.ExtraFields>(project) && postCampaignLink !== undefined) {\n dispatch(modalAction.toggleModalPostCampaign(true))\n } else {\n tracking.track({\n event: EVENT_TYPE.GENERIC,\n eventCategory: CATEGORY.PROJECT_PAGE,\n eventAction: TRACKING_ACTION.DISPLAY_REWARD,\n eventLabel: source,\n })\n dispatch(modalAction.toggleModalReward(true, { id: firstReward.id.toString() }))\n }\n }}\n />\n ),\n reward: model.reward.title(firstReward),\n })\n }\n\n if (!hasTip) {\n return t('supported the project with a donation')\n }\n\n return <></>\n }\n\n return (\n <>\n {rewardContent()}\n {/* Free contribution */}\n {hasTip &&\n !isLegacy &&\n !isHidden &&\n supporterLatestOrder &&\n firstReward &&\n t(' and supported the project with a donation')}\n {hasTip &&\n !isLegacy &&\n !isHidden &&\n supporterLatestOrder &&\n !firstReward &&\n t('supported the project with a donation')}\n </>\n )\n}\n\nconst BackerInfo = styled(styles.BackerInfo)`\n ${plume.styles.copy.M} {\n margin-bottom: 0;\n }\n\n ${plume.styles.copy.M}, ${plume.Link} {\n display: inline;\n }\n`\n\nconst CopyWrapper = styled.div<{ hasComment?: boolean }>`\n margin-right: 5px;\n display: flex;\n\n ${({ hasComment }) => {\n return hasComment\n ? css`\n flex-wrap: wrap;\n flex-direction: column;\n `\n : css`\n align-items: center;\n `\n }}\n`\n\nconst Copy = styled.p`\n margin: 0 0 5px 0;\n display: inline-flex;\n align-items: end;\n`\n\nconst CommentWrapper = styled(styles.BackerCommentWrapper)``\n\nconst DateInfo = styled(plume.styles.heading.XXXXXS)<{ hasComment?: boolean }>`\n ${({ hasComment }) => {\n return (\n !hasComment &&\n css`\n @media screen and ${plume.BREAKPOINTS.MOBILE_L} {\n transform: translateY(11px);\n }\n `\n )\n }}\n`\n", "import { Project, ExtraFields } from '../../../models/project'\n\nimport * as model from '@owl-nest/models'\nimport { Reward } from '@owl-nest/models/src/reward'\nimport { Order, Supporter } from '@owl-nest/api-client/latest'\n\ntype FormattedBacker = {\n dateOrder: Date | undefined\n firstReward: Reward<ExtraFields> | undefined\n hasTip: boolean\n isLegacy: boolean\n isHidden: boolean\n labelColor: model.user.RoleTagBackgroundColor\n labelName: string | undefined\n supporterLatestOrder: Order | undefined\n}\n\nexport function formatBacker(supporter: Supporter, project: Project): FormattedBacker {\n const supporterLatestOrder = supporter.latest_project_order\n\n const firstOrderItem = supporterLatestOrder?.items && supporterLatestOrder.items[0]\n const firstReward = firstOrderItem ? model.orderItem.getReward<ExtraFields>(firstOrderItem, project) : undefined\n const hasTip = supporterLatestOrder !== undefined && supporterLatestOrder.tip > 0\n const dateOrder = supporterLatestOrder ? new Date(supporterLatestOrder?.created_at) : undefined\n const label = supporter.labels ? model.user.label(supporter.labels[0]) : undefined\n const isLegacy = firstReward ? model.reward.isLegacy(firstReward) : false\n const isHidden =\n (supporterLatestOrder?.items ?? []).filter((item) => {\n const reward = model.orderItem.getReward<ExtraFields>(item, project)\n return reward?.is_hidden\n }).length > 0\n\n return {\n dateOrder,\n firstReward,\n hasTip,\n isLegacy: isLegacy,\n isHidden: isHidden,\n labelColor: label?.color,\n labelName: label?.label,\n supporterLatestOrder,\n }\n}\n", "import * as React from 'react'\nimport styled from 'styled-components'\n\nimport { RoleTag, COLORS, styles as S } from '@ulule/owl-kit-components/next'\nimport * as model from '@owl-nest/models'\nimport { t } from '@owl-nest/localize'\n\nimport { Project } from '../../../../models/project'\nimport { Fan } from '../../../../models/fan'\n\ntype FollowerPropTypes = {\n follower: Fan\n project: Project\n}\n\nexport function Follower({ follower }: FollowerPropTypes): React.ReactElement<FollowerPropTypes> {\n const label = follower.labels ? model.user.label(follower.labels[0]) : undefined\n\n return (\n <FollowerContainer>\n {/* Avatar */}\n <Avatar href={follower.is_public ? follower.absolute_url : ''}>\n <S.image.Avatar src={model.user.avatar(follower, '40x40')} type=\"small\" />\n </Avatar>\n <FollowerInfos>\n {/* Name */}\n {follower.is_anonymous ? (\n <S.heading.XXXS>{t('Anonymous backer')}</S.heading.XXXS>\n ) : (\n <S.heading.XXXS as=\"a\" href={follower.is_public ? follower.absolute_url : ''}>\n {model.user.fullName(follower)}\n </S.heading.XXXS>\n )}\n {/* Label */}\n {label && <RoleTag backgroundColor={label.color}>{label.label}</RoleTag>}\n </FollowerInfos>\n </FollowerContainer>\n )\n}\n\nconst FollowerContainer = styled.div`\n display: flex;\n padding: 7px;\n align-items: center;\n align-content: center;\n background-color: ${COLORS.PRIMARY_GREY_000};\n`\nconst Avatar = styled.a`\n margin-right: 10px;\n`\nconst FollowerInfos = styled.div`\n flex-grow: 1;\n display: flex;\n align-items: center;\n align-content: center;\n\n a {\n text-decoration: none;\n }\n\n a,\n ${S.heading.XXXS} {\n display: inline-block;\n }\n\n ${S.heading.XXXS}, ${S.tag.RoleTag} {\n margin-right: 5px;\n }\n`\n", "import * as React from 'react'\nimport * as api from '@owl-nest/api-client/latest'\nimport styled from 'styled-components'\n\nimport { t, tc } from '@owl-nest/localize'\nimport { MoneyDisplayer } from '@owl-nest/money'\nimport * as shadow from '@owl-nest/shadow'\nimport { BREAKPOINTS, RoleTag, styles as S } from '@ulule/owl-kit-components/next'\n\nimport * as styles from '../../style'\nimport { Project } from '../../../../models/project'\n\ntype EngineTagProps = {\n children: React.ReactElement\n type: api.SponsorshipType\n}\n\nconst Price = styled(RoleTag)`\n flex-shrink: 0;\n`\n\nconst BackerInfo = styled(styles.BackerInfo)`\n flex-wrap: wrap;\n\n ${S.copy.M} {\n display: inline;\n }\n\n @media screen and ${BREAKPOINTS.TABLET} {\n flex-wrap: nowrap;\n }\n`\n\nconst Copy = styled.p`\n margin: 0 5px 10px 0;\n`\n\nfunction EngineTag({ type, children }: EngineTagProps): React.ReactElement<EngineTagProps> {\n const tagsTypes = {\n amount: {\n icon: '\u26A1\uFE0F',\n text: '+ ',\n },\n prize_winner: {\n icon: '\uD83C\uDFC6',\n text: t('Winner'),\n },\n doubled_donations: {\n icon: '\u26A1\uFE0F',\n text: t('Matched donations'),\n },\n crush: {\n icon: '\u2764\uFE0F',\n text: t('Heartthrob'),\n },\n audience: {\n icon: '\uD83D\uDC4F',\n text: t('Crowd favorite prize'),\n },\n }\n\n return (\n <>\n <span role=\"img\" aria-label=\"price emoji\">\n {tagsTypes[type].icon}\n </span>\n {tagsTypes[type].text}\n {type === 'amount' && children}\n </>\n )\n}\n\ntype SponsorPropTypes = {\n sponsorship: api.Sponsorship\n project: Project\n}\n\nexport function Sponsor({ sponsorship, project }: SponsorPropTypes): React.ReactElement<SponsorPropTypes> {\n const sponsorRef = React.useRef(null)\n\n shadow.usePartnershipTracker(sponsorship.sponsor.user.id, sponsorRef, {\n click: {\n enabled: true,\n },\n eventPosition: 'backer-list',\n impression: {\n enabled: true,\n once: true,\n },\n })\n\n return (\n <styles.BackerContainer variant=\"sponsor\">\n {/* Avatar */}\n <styles.Avatar href={sponsorship.sponsor.link}>\n <S.image.Avatar src={sponsorship.sponsor.image.versions?.small.url} type=\"medium\" />\n </styles.Avatar>\n <BackerInfo>\n <Copy ref={sponsorRef}>\n {/* Name */}\n <S.heading.XS as=\"a\" href={sponsorship.sponsor.link} target=\"_blank\" rel=\"noopener noreferrer\">\n {sponsorship.sponsor.user.name}\n </S.heading.XS>\n {/* Label */}\n <RoleTag forwardedAs=\"span\" backgroundColor=\"primary-red-900\">\n {t('Partner')}\n </RoleTag>\n <br />\n {/* Contribution */}\n <S.copy.M as=\"span\">\n {tc('supports this project at [price]', {\n price: <MoneyDisplayer amount={sponsorship.amount} project={project} />,\n })}\n </S.copy.M>\n </Copy>\n {/* Sponsor engine tag */}\n <Price backgroundColor=\"primary-sand-500\">\n <EngineTag type={sponsorship?.type || api.SponsorshipType.AMOUNT}>\n <MoneyDisplayer amount={sponsorship?.amount} project={project} />\n </EngineTag>\n </Price>\n </BackerInfo>\n </styles.BackerContainer>\n )\n}\n", "import * as React from 'react'\n\nimport * as model from '@owl-nest/models'\n\nimport { useStep, Step } from './useStep'\nimport { Welcome } from './view/Welcome'\nimport { Profile } from './view/Profile'\nimport { Category } from './view/Category'\nimport { CommunityOnboarding } from './view/CommunityOnboarding'\nimport { ProjectType } from './view/ProjectType'\nimport { RewardType } from './view/RewardType'\nimport { Training } from './view/Training'\nimport { Slug } from './view/Slug'\nimport { Layout } from './Layout'\n\ntype OnboardingProps = {\n project: model.project.ProjectForOwner\n}\n\nexport function Onboarding({ project }: OnboardingProps): React.ReactElement {\n const { step, isDone } = useStep(project)\n\n if (isDone) {\n return <></>\n }\n\n return (\n <Layout project={project} withProgress={step?.key !== Step.WELCOME}>\n {step?.key === Step.WELCOME && <Welcome project={project} />}\n {step?.key === Step.PROJECT_TYPE && <ProjectType project={project} />}\n {step?.key === Step.IMPORT_TYPE && <CommunityOnboarding project={project} />}\n {step?.key === Step.CATEGORY && <Category project={project} />}\n {step?.key === Step.REWARD_TYPE && <RewardType project={project} />}\n {step?.key === Step.TRAINING && <Training project={project} />}\n {step?.key === Step.SLUG && <Slug project={project} />}\n {step?.key === Step.PROFILE && <Profile project={project} />}\n </Layout>\n )\n}\n", "import * as React from 'react'\nimport styled from 'styled-components'\n\nimport * as consent from '@owl-nest/consent'\nimport { t } from '@owl-nest/localize'\nimport * as model from '@owl-nest/models'\nimport * as plume from '@ulule/owl-kit-components/next'\n\nimport * as UFE from '../../../../UFE'\nimport { useStep } from '../useStep'\n\nconst VIDEO_ID = 'welcome-video'\n\n// declare that a global YT variable exists (will be loaded elsewhere if needed)\ndeclare const YT: { Player: new (id: string, config: any) => unknown }\n\ntype WelcomProps = {\n project: model.project.ProjectForOwner\n}\n\nexport function Welcome({ project }: WelcomProps): React.ReactElement {\n const video = model.i18n.get(UFE.VIDEOS.onboardingWelcome.version)\n const videoHtml = `<iframe id=\"${VIDEO_ID}\" allow=\"accelerometer; autoplay; encrypted-media;\" src=\"${video}&enablejsapi=1&showinfo=0&autohide=1&autoplay=1&controls=1&fs=0&cc_load_policy=1\" frameBorder=\"0\" allowFullScreen />`\n const videoPlaceholder = model.i18n.get(UFE.VIDEOS.onboardingWelcome.placeholder)\n\n const playerRef = React.useRef<unknown | null>(null)\n\n const { setStepValue } = useStep(project)\n\n return (\n <Wrapper>\n <Title>\n <plume.glyphs.decoration.Quote size={14} />\n <plume.styles.heading.XL>{t('Welcome!')}</plume.styles.heading.XL>\n </Title>\n <plume.styles.heading.XXS>\n {t(\n 'We are very happy to have you among us. Jess will explain to you in 1 minute how it works and the next steps:',\n )}\n </plume.styles.heading.XXS>\n <VideoClickWrapper onClick={handleVidoClick}>\n <plume.VideoLoader\n consentWall={consent.media.Wall}\n placeholder={videoPlaceholder?.['x1'] ?? ''}\n srcSet={`${videoPlaceholder?.['x1']} 2x, ${videoPlaceholder?.['x3']} 3x`}\n videoHtml={videoHtml}\n />\n </VideoClickWrapper>\n <plume.Button kind=\"primary\" onClick={handleDone}>\n {t('Start')}\n </plume.Button>\n </Wrapper>\n )\n\n function handleDone(): void {\n setStepValue()\n }\n\n function handleVidoClick(): void {\n if (playerRef.current !== null) {\n return\n }\n\n setTimeout(() => {\n playerRef.current = new YT.Player(VIDEO_ID, {\n events: {\n onStateChange: onPlayerStateChange,\n },\n })\n })\n }\n\n function onPlayerStateChange(state: { data: number }): void {\n const hasVideoEnded = state.data === 0\n if (hasVideoEnded) {\n handleDone()\n }\n }\n}\n\nconst Title = styled.div`\n position: relative;\n\n ${plume.glyphs.decoration.Quote} {\n position: absolute;\n left: -11px;\n top: 15px;\n }\n`\n\nconst VideoClickWrapper = styled.div`\n display: flex;\n justify-content: center;\n width: 100%;\n max-width: 550px;\n`\n\nconst Wrapper = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n text-align: center;\n\n ${plume.VideoLoader} {\n width: 100%;\n }\n\n ${plume.styles.heading.XL}, ${plume.styles.heading.XXS} {\n margin-bottom: 24px;\n }\n\n ${plume.styles.heading.XL} {\n margin-top: 16px;\n }\n\n ${plume.Button} {\n margin: 48px 0 32px;\n align-self: center;\n\n @media screen and ${plume.BREAKPOINTS.TABLET} {\n margin: 32px 0 16px;\n }\n }\n`\n", "import * as React from 'react'\nimport * as formik from 'formik'\nimport styled from 'styled-components'\n\nimport * as plume from '@ulule/owl-kit-components/next'\nimport * as model from '@owl-nest/models'\nimport * as api from '@owl-nest/api-client/latest'\nimport { t } from '@owl-nest/localize'\nimport * as service from '@owl-nest/services'\nimport { imageUploader } from '@owl-nest/behaviours'\nimport * as yup from '@owl-nest/validators'\n\nimport { useStep, getStepIndex, getStepProgress, Step } from '../useStep'\nimport { Progress } from '../components/Progress'\nimport { Coaching } from '../components/Coaching'\nimport { Actions } from '../components/Actions'\nimport { Tip } from '../components/Tip'\n\nimport { SolidContent } from './styles'\n\ntype ProfileProps = {\n project: model.project.ProjectForOwner\n}\n\nexport function Profile({ project }: ProfileProps): React.ReactElement {\n const { setStepValue } = useStep(project)\n const auth = service.user.useAuth()\n const user = project.owner\n\n const [avatar, setAvatar] = React.useState<string | undefined>(undefined)\n\n React.useEffect(() => {\n if (user !== undefined) {\n setAvatar(model.user.avatar(user, 'full'))\n }\n }, [user])\n\n const { onChange: onImageChange } = imageUploader.useImageUploader({\n handleChange: async (file, url) => {\n setAvatar(await url)\n },\n })\n\n return (\n <>\n <Progress progress={getStepProgress(Step.PROFILE)} step={getStepIndex(Step.PROFILE)} name={t('Your profile')} />\n <Coaching project={project}>{t('Add an image and a display name to your profile.')}</Coaching>\n\n <formik.Formik\n initialValues={{\n username: user ? model.user.username(user) : '',\n image: undefined,\n }}\n validationSchema={yup.object({\n username: yup.string().required(),\n image: yup.file(),\n })}\n onSubmit={({ username, image }) => {\n if (auth.type === 'loggedin' && username) {\n auth.update(auth.user.id, { screenname: username })\n }\n if (auth.type === 'loggedin' && image) {\n api.api.patch.userAvatar({\n urlParams: { userId: String(auth.user.id) },\n body: { image },\n })\n }\n setStepValue()\n }}\n >\n {(formikBag) => {\n React.useEffect(() => {\n if (user !== undefined) {\n formikBag.setFieldValue('username', model.user.username(user))\n }\n }, [user])\n\n return (\n <Form onSubmit={formikBag.handleSubmit}>\n <SolidContent>\n <formik.Field name=\"image\">\n {({ field, form }: formik.FieldProps<string>) => {\n return (\n <plume.AvatarField\n value={avatar}\n onChange={(event) => {\n const file = onImageChange(event)\n form.setFieldValue(field.name, file)\n }}\n translations={{ add: t('Add a profile image') }}\n />\n )\n }}\n </formik.Field>\n <formik.Field name=\"username\">\n {({ field, meta }: formik.FieldProps<string>) => {\n return (\n <plume.TextField\n label={t('Your profile\u2019s display name')}\n {...field}\n error={meta.touched && meta.error}\n />\n )\n }}\n </formik.Field>\n </SolidContent>\n\n <Tip>{t('Nothing final, you can edit this information later.')}</Tip>\n <Actions>\n <plume.LinkAsButton kind=\"secondary\" type=\"button\" onClick={() => setStepValue()}>\n {t('Skip')}\n </plume.LinkAsButton>\n <plume.Button kind=\"primary\">{t('Next')}</plume.Button>\n </Actions>\n </Form>\n )\n }}\n </formik.Formik>\n </>\n )\n}\n\nconst Form = styled.form`\n height: calc(100% - (132px + 4 * 22px));\n\n ${plume.AvatarField} {\n margin: 37px auto 27px;\n width: fit-content;\n }\n\n ${plume.TextField} {\n max-width: 600px;\n margin-left: auto;\n margin-right: auto;\n margin-bottom: 52px;\n }\n`\n", "import * as React from 'react'\nimport styled from 'styled-components'\n\nimport * as plume from '@ulule/owl-kit-components/next'\n\ntype ProgressProps = {\n className?: string\n progress: number\n step: string\n name: string\n}\n\nfunction ProgressComponent({ progress, step, className, name }: ProgressProps) {\n return (\n <div className={className}>\n <ProgressBar progress={progress} />\n <plume.styles.heading.Card1>\n <Step>{step}</Step>\n <Name>{name}</Name>\n </plume.styles.heading.Card1>\n </div>\n )\n}\n\nexport const Progress = styled(ProgressComponent)`\n ${plume.styles.heading.Card1} {\n margin: 8px 16px;\n }\n`\n\nconst Name = styled.span`\n color: ${plume.COLORS.PRIMARY_BLACK};\n margin-left: 8px;\n`\n\nconst Step = styled.span`\n color: ${plume.COLORS.GREY_SHADE_2};\n`\n\nconst ProgressBar = styled.div<{ progress: number }>`\n background: ${plume.COLORS.PRIMARY_SAND};\n height: 15px;\n width: 100%;\n border-radius: 16px;\n\n &:before {\n content: '';\n background: ${plume.COLORS.PRIMARY_GREEN};\n height: 15px;\n position: absolute;\n left: 0;\n top: 0;\n right: ${({ progress }) => Math.floor((1 - progress) * 100)}%;\n border-radius: 16px;\n }\n`\n", "import * as React from 'react'\nimport styled from 'styled-components'\n\nimport * as models from '@owl-nest/models'\nimport * as plume from '@ulule/owl-kit-components/next'\n\ntype CoachingProps = {\n children: React.ReactNode\n className?: string\n project: models.project.ProjectForOwner\n}\n\nfunction CoachingComponent({ project, children, className }: CoachingProps) {\n const manager = project.manager ?? project.default_manager\n return (\n <div className={className}>\n {manager && <plume.styles.image.Avatar src={models.user.avatar(manager, 'full')} type=\"small\" withShadow />}\n <plume.styles.copy.S asDesktop=\"M\">{children}</plume.styles.copy.S>\n </div>\n )\n}\n\nexport const Coaching = styled(CoachingComponent)`\n display: flex;\n margin: 16px 0 32px;\n\n ${plume.styles.copy.S}, ${plume.styles.copy.M} {\n background: ${plume.COLORS.PRIMARY_SAND_100};\n border-radius: 4px;\n font-weight: 600; /* HACK: Irregular font manipulation. We'll be adding copy.S.semiBold & copy.M.semiBold, so this is just by anticipation. */\n margin-left: 16px;\n padding: 16px;\n width: 100%;\n }\n\n @media screen and ${plume.BREAKPOINTS.TABLET} {\n margin: 52px 32px 32px;\n }\n`\n", "import styled from 'styled-components'\n\nimport * as plume from '@ulule/owl-kit-components/next'\n\nexport const Actions = styled.div`\n background-color: ${plume.COLORS.PRIMARY_GREY_000};\n bottom: 0;\n display: flex;\n justify-content: end;\n margin: 0;\n padding: 16px 0;\n position: sticky;\n right: 0;\n z-index: 2;\n\n ${plume.LinkAsButton} {\n margin: 0 10px;\n }\n\n @media screen and ${plume.BREAKPOINTS.TABLET} {\n bottom: 16px;\n justify-content: center;\n left: unset;\n padding: 0;\n position: absolute;\n right: 16px;\n }\n`\n", "import * as React from 'react'\nimport styled from 'styled-components'\n\nimport * as plume from '@ulule/owl-kit-components/next'\n\ntype CoachingProps = {\n className?: string\n children: React.ReactNode\n}\n\nfunction TipComponent({ children, className }: CoachingProps) {\n return (\n <div className={className}>\n <plume.glyphs.stroke.Bulb size={10} />\n <plume.styles.copy.S>{children}</plume.styles.copy.S>\n </div>\n )\n}\n\nexport const Tip = styled(TipComponent)`\n background-color: ${plume.COLORS.PRIMARY_GREY_000};\n bottom: calc(50px + 16px + 16px);\n display: flex;\n margin: 10px 0;\n\n bottom: 82px;\n display: flex;\n margin: 10px 0px;\n position: sticky;\n z-index: 2;\n padding: 16px 0 0;\n\n ${plume.glyphs.stroke.Bulb} {\n background-color: ${plume.COLORS.SECONDARY_GREEN_500};\n color: ${plume.COLORS.PRIMARY_GREY_000};\n border-radius: 50%;\n width: 10px;\n height: 14px;\n padding: 4px 6px;\n margin-right: 14px;\n flex: 0 0 auto;\n }\n\n @media screen and ${plume.BREAKPOINTS.TABLET} {\n bottom: unset;\n margin: 60px 0 16px;\n position: unset;\n width: calc(100% - 250px);\n }\n`\n", "import styled from 'styled-components'\n\nimport * as plume from '@ulule/owl-kit-components/next'\n\nexport const SolidContent = styled.div`\n background-color: ${plume.COLORS.PRIMARY_GREY_000};\n height: 100%;\n position: relative;\n\n @media not screen and ${plume.BREAKPOINTS.TABLET} {\n z-index: 1;\n }\n`\n\nexport const Form = styled.form<{ multiplier?: number }>`\n height: ${({ multiplier }) => `calc(100% - (132px + ${multiplier ?? 2} * 22px))`};\n\n @media screen and (max-height: 740px) {\n height: unset;\n }\n\n ${plume.RadioGroupField} {\n margin-left: auto;\n margin-right: auto;\n }\n\n ${plume.RadioField} {\n margin-bottom: 16px;\n\n &:is(:last-child) {\n margin-bottom: 0;\n }\n\n ${plume.Field} {\n padding-right: 75px;\n }\n }\n`\n", "import * as React from 'react'\nimport * as formik from 'formik'\nimport styled from 'styled-components'\n\nimport * as plume from '@ulule/owl-kit-components/next'\nimport * as model from '@owl-nest/models'\nimport * as service from '@owl-nest/services'\nimport * as hooks from '@owl-nest/hooks'\nimport { t } from '@owl-nest/localize'\n\nimport { useStep, getStepIndex, getStepProgress, Step } from '../useStep'\nimport { Progress } from '../components/Progress'\nimport { Coaching } from '../components/Coaching'\nimport { Tip } from '../components/Tip'\nimport { Actions } from '../components/Actions'\n\nimport { SolidContent } from './styles'\n\ntype CategoryProps = {\n project: model.project.ProjectForOwner\n}\n\nexport function Category({ project }: CategoryProps): React.ReactElement {\n const { response } = service.category.useCategories({ fetchOnMount: true })\n const { setStepValue } = useStep(project)\n\n const projectIsDonationBased = model.project.isDonationBased(project)\n\n const categories = React.useMemo(() => {\n if (response.status === hooks.QueryStatus.SUCCESS) {\n const categories = response.data.categories\n .filter((category) => category.slug !== 'other' && category.slug !== 'fundraisers')\n .sort((a, b) => {\n const nameA = model.i18n.get(a.name)\n const nameB = model.i18n.get(b.name)\n if (nameA === undefined && nameB === undefined) {\n return 0\n }\n if (nameA === undefined) {\n return 1\n }\n if (nameB === undefined) {\n return -1\n }\n return nameA.localeCompare(nameB)\n })\n\n // Add `fundraisers` category at the beginning of the list for donation based projects\n const fundraisers = response.data.categories.find((category) => category.slug === 'fundraisers')\n if (fundraisers !== undefined) {\n if (projectIsDonationBased) {\n categories.unshift(fundraisers)\n } else {\n categories.push(fundraisers)\n }\n }\n\n const other = response.data.categories.find((category) => category.slug === 'other')\n if (other !== undefined) {\n categories.push(other)\n }\n return categories\n }\n }, [response.status])\n\n return (\n <>\n <Progress\n progress={getStepProgress(Step.CATEGORY)}\n step={getStepIndex(Step.CATEGORY)}\n name={t('Project\u2019s main category')}\n />\n <Coaching project={project}>{t('Which category best suits your project?')}</Coaching>\n\n <formik.Formik\n initialValues={{\n category: projectIsDonationBased ? 'fundraisers' : undefined,\n }}\n onSubmit={(values) => {\n setStepValue({ main_tag: values.category })\n }}\n validateOnChange={false}\n validateOnBlur={false}\n >\n {(formikBag) => {\n return (\n <Form onSubmit={formikBag.handleSubmit}>\n <SolidContent>\n <formik.Field name=\"category\">\n {({ field, form }: formik.FieldProps<string>) => {\n return (\n <List>\n {categories &&\n categories.map((category) => (\n <li key={category.id}>\n <plume.ClickableTag\n isActive={field.value === category.slug}\n label={model.i18n.get(category.name) || ''}\n onClick={() => {\n form.setFieldValue('category', category.slug)\n }}\n type=\"button\"\n />\n </li>\n ))}\n </List>\n )\n }}\n </formik.Field>\n </SolidContent>\n\n <Tip>{t('Nothing final, you can edit this information later.')}</Tip>\n <Actions>\n <plume.LinkAsButton kind=\"secondary\" type=\"button\" onClick={() => setStepValue()}>\n {t('Skip')}\n </plume.LinkAsButton>\n <plume.Button kind=\"primary\">{t('Next')}</plume.Button>\n </Actions>\n </Form>\n )\n }}\n </formik.Formik>\n </>\n )\n}\n\nconst Form = styled.form`\n height: calc(100% - (132px + 2 * 22px));\n\n li {\n padding-left: 4px;\n padding-right: 4px;\n }\n\n @media screen and ${plume.BREAKPOINTS.TABLET} {\n ${Tip} {\n margin-top: 44px; // The original 60px - 16px, the ClickableTag bottom margin\n }\n }\n`\n\nconst List = styled.ul`\n display: flex;\n flex-wrap: wrap;\n justify-content: center;\n list-style: none;\n margin: 0 auto;\n max-height: 45vh;\n max-width: 445px;\n overflow: scroll;\n padding: 0;\n\n ${plume.ClickableTag} {\n margin-bottom: 16px;\n margin-right: 8px;\n }\n`\n", "import * as React from 'react'\nimport * as formik from 'formik'\nimport styled from 'styled-components'\n\nimport * as api from '@owl-nest/api-client/next'\nimport * as plume from '@ulule/owl-kit-components/next'\nimport * as model from '@owl-nest/models'\nimport { t } from '@owl-nest/localize'\n\nimport { useStep, getStepIndex, getStepProgress, Step } from '../useStep'\nimport { Progress } from '../components/Progress'\nimport { Coaching } from '../components/Coaching'\nimport { Actions } from '../components/Actions'\nimport { Tip } from '../components/Tip'\nimport { Form, SolidContent } from './styles'\n\ntype CommunityOnboardingProps = {\n project: model.project.ProjectForOwner\n}\n\nenum FormField {\n IMPORT_TYPE = 'import_type',\n}\n\ntype Form = {\n [FormField.IMPORT_TYPE]: api.ImportType\n}\n\nexport function CommunityOnboarding({ project }: CommunityOnboardingProps): React.ReactElement {\n const { setStepValue } = useStep(project)\n\n return (\n <>\n <Progress\n progress={getStepProgress(Step.IMPORT_TYPE)}\n step={getStepIndex(Step.IMPORT_TYPE)}\n name={t('Ulule community')}\n />\n {project.community_members_count && (\n <Coaching project={project}>\n {t(\n `We've counted %(communityMembersCount)d people who have backed your previous Ulule projects. How would you like to appeal to this community?`,\n { communityMembersCount: project.community_members_count },\n )}\n </Coaching>\n )}\n <formik.Formik\n initialValues={{\n [FormField.IMPORT_TYPE]: api.ImportType.MEMBER,\n }}\n onSubmit={(values) => {\n setStepValue(undefined, values[FormField.IMPORT_TYPE])\n }}\n validateOnChange={false}\n validateOnBlur={false}\n >\n {(formikBag) => {\n return (\n <Form onSubmit={formikBag.handleSubmit}>\n <SolidContent>\n <formik.Field name={FormField.IMPORT_TYPE}>\n {({ field }: formik.FieldProps<api.ImportType>) => {\n return (\n <RadioGroupField type=\"big\">\n <plume.RadioField\n name={field.name}\n value={api.ImportType.MEMBER}\n checked={field.value === api.ImportType.MEMBER}\n onChange={field.onChange}\n onBlur={field.onBlur}\n key={api.ImportType.MEMBER}\n label={\n <>\n {t('Import these people as members of your page')} <Tag>{t('Recommended')}</Tag>\n </>\n }\n description={t(\n 'Backers of your projects will immediately become free members when your page is launched and will receive a notification email.',\n )}\n />\n <plume.RadioField\n name={field.name}\n value={api.ImportType.PREVIOUS_BACKER}\n checked={field.value === api.ImportType.PREVIOUS_BACKER}\n onChange={field.onChange}\n onBlur={field.onBlur}\n key={api.ImportType.PREVIOUS_BACKER}\n label={t('Notify all my former supporters of the launch of this page')}\n description={t(\n 'Supporters of your projects will only receive a notification email when your page is launched and will have to subscribe to your page themselves.',\n )}\n />\n <plume.RadioField\n name={field.name}\n value={api.ImportType.NONE}\n checked={field.value === api.ImportType.NONE}\n onChange={field.onChange}\n onBlur={field.onBlur}\n key={api.ImportType.NONE}\n label={t('Do nothing')}\n description={t('You take full responsibility for communication.')}\n />\n </RadioGroupField>\n )\n }}\n </formik.Field>\n </SolidContent>\n\n <Tip>{t('Nothing final, you can edit this information later.')}</Tip>\n <Actions>\n <plume.Button kind=\"primary\">{t('Next')}</plume.Button>\n </Actions>\n </Form>\n )\n }}\n </formik.Formik>\n </>\n )\n}\n\nconst RadioGroupField = styled(plume.RadioGroupField)`\n max-width: 593px;\n`\n\nconst Tag = styled(plume.Tag)`\n display: inline-block;\n`\n", "import * as React from 'react'\nimport * as formik from 'formik'\nimport styled from 'styled-components'\n\nimport * as plume from '@ulule/owl-kit-components/next'\nimport * as model from '@owl-nest/models'\nimport { t, tp } from '@owl-nest/localize'\n\nimport * as UFE from '../../../../UFE'\n\nimport { useStep, getStepIndex, getStepProgress, Step } from '../useStep'\nimport { Progress } from '../components/Progress'\nimport { Coaching } from '../components/Coaching'\nimport { Actions } from '../components/Actions'\nimport { Tip } from '../components/Tip'\n\nimport { Form, SolidContent } from './styles'\n\ntype ProjectTypeProps = {\n project: model.project.ProjectForOwner\n}\n\nexport function ProjectType({ project }: ProjectTypeProps): React.ReactElement {\n const { setStepValue } = useStep(project)\n\n return (\n <>\n <Progress\n progress={getStepProgress(Step.PROJECT_TYPE)}\n step={getStepIndex(Step.PROJECT_TYPE)}\n name={t('Your project')}\n />\n <Coaching project={project}>\n {t('Welcome to Ulule! Here\u2019s the formula that I think would be best for you:')}\n </Coaching>\n <formik.Formik\n initialValues={{\n type: project.type,\n }}\n onSubmit={(values) => {\n setStepValue({ type: values.type })\n }}\n validateOnChange={false}\n validateOnBlur={false}\n >\n {(formikBag) => {\n return (\n <StyledForm onSubmit={formikBag.handleSubmit}>\n <SolidContent>\n <formik.Field name=\"type\">\n {({ field }: formik.FieldProps<string>) => {\n return (\n <plume.RadioGroupField type=\"big\">\n <plume.RadioField\n name={field.name}\n value=\"project\"\n checked={field.value === 'project'}\n onChange={field.onChange}\n onBlur={field.onBlur}\n key=\"project\"\n label={\n <>\n {t('Reward-based fundraising')}\n <plume.illustrations.twoToned.BookAndStuff size={50} />\n </>\n }\n description={t(\n 'You offer rewards in exchange for financial support, with a minimum goal to reach within a given time frame.',\n )}\n />\n <plume.RadioField\n name={field.name}\n value=\"donation\"\n checked={field.value === 'donation'}\n onChange={field.onChange}\n onBlur={field.onBlur}\n key=\"donation\"\n label={\n <>\n {t('Donation-based fundraising')}\n <plume.illustrations.twoToned.Coins size={50} />\n </>\n }\n description={t(\n 'You receive one-time or monthly donations (without any reward). Having a goal and deadline are optional.',\n )}\n />\n <plume.RadioField\n name={field.name}\n value=\"membership\"\n checked={field.value === 'membership'}\n onChange={field.onChange}\n onBlur={field.onBlur}\n key=\"membership\"\n label={\n <>\n {tp('Memberships', 'Project type')}\n <plume.illustrations.twoToned.Community size={50} />\n </>\n }\n description={t(\n 'You receive monthly support through memberships or donations from your community, with or without compensation.',\n )}\n />\n </plume.RadioGroupField>\n )\n }}\n </formik.Field>\n </SolidContent>\n\n <Tip>{t('Nothing final, you can edit this information later.')}</Tip>\n <Actions>\n <plume.LinkAsButton kind=\"secondary\" type=\"button\" onClick={() => setStepValue()}>\n {t('Skip')}\n </plume.LinkAsButton>\n <plume.Button kind=\"primary\">{t('Next')}</plume.Button>\n </Actions>\n </StyledForm>\n )\n }}\n </formik.Formik>\n </>\n )\n}\n\nconst StyledForm = styled(Form)`\n ${plume.RadioGroupField} {\n max-width: 462px;\n\n ${plume.illustrations.Illustration} {\n position: absolute;\n top: 25%;\n right: 13px;\n }\n }\n`\n", "import * as React from 'react'\nimport * as formik from 'formik'\nimport styled from 'styled-components'\n\nimport * as plume from '@ulule/owl-kit-components/next'\nimport * as model from '@owl-nest/models'\nimport { t } from '@owl-nest/localize'\n\nimport { useStep, getStepIndex, getStepProgress, Step } from '../useStep'\nimport { Progress } from '../components/Progress'\nimport { Coaching } from '../components/Coaching'\nimport { Actions } from '../components/Actions'\nimport { Tip } from '../components/Tip'\n\nimport { Form, SolidContent } from './styles'\n\ntype RewardTypeProps = {\n project: model.project.ProjectForOwner\n}\n\nexport function RewardType({ project }: RewardTypeProps): React.ReactElement {\n const { setStepValue } = useStep(project)\n\n return (\n <>\n <Progress\n progress={getStepProgress(Step.REWARD_TYPE)}\n step={getStepIndex(Step.REWARD_TYPE)}\n name={t('Crowdfunding type')}\n />\n <Coaching project={project}>\n {t('Imagine that you\u2019re presenting the project to an acquaintance. What would you say?')}\n </Coaching>\n <formik.Formik\n initialValues={{\n type: undefined,\n }}\n onSubmit={(values) => {\n setStepValue({ type: values.type })\n }}\n validateOnChange={false}\n validateOnBlur={false}\n >\n {(formikBag) => {\n return (\n <StyledForm onSubmit={formikBag.handleSubmit} multiplier={3}>\n <SolidContent>\n <formik.Field name=\"type\">\n {({ field }: formik.FieldProps<string>) => {\n return (\n <plume.RadioGroupField type=\"big\">\n <plume.RadioField\n name={field.name}\n value={'presale'}\n checked={field.value === 'presale'}\n onChange={field.onChange}\n onBlur={field.onBlur}\n key={'presale'}\n label={\n <>\n {t('I want to presell an amount of units to fund my project')}\n <plume.illustrations.twoToned.BookAndStuff size={50} />\n </>\n }\n description={t(\"Example: I'm selling 100 t-shirts\")}\n />\n <plume.RadioField\n name={field.name}\n value={'project'}\n checked={field.value === 'project'}\n onChange={field.onChange}\n onBlur={field.onBlur}\n key={'project'}\n label={\n <>\n {t('I want to raise money to fund my project')}\n <plume.illustrations.twoToned.Coins size={50} />\n </>\n }\n description={t(\"Example: I'm raising 3 000$\")}\n />\n </plume.RadioGroupField>\n )\n }}\n </formik.Field>\n </SolidContent>\n\n <Tip>{t('Nothing final, you can edit this information later.')}</Tip>\n <Actions>\n <plume.LinkAsButton kind=\"secondary\" type=\"button\" onClick={() => setStepValue()}>\n {t('Skip')}\n </plume.LinkAsButton>\n <plume.Button kind=\"primary\">{t('Next')}</plume.Button>\n </Actions>\n </StyledForm>\n )\n }}\n </formik.Formik>\n </>\n )\n}\n\nconst StyledForm = styled(Form)`\n ${plume.RadioGroupField} {\n max-width: 600px;\n\n ${plume.illustrations.Illustration} {\n position: absolute;\n top: 25%;\n right: 13px;\n }\n\n @media screen and ${plume.BREAKPOINTS.TABLET} {\n ${plume.illustrations.Illustration} {\n position: absolute;\n top: 10px;\n right: 13px;\n }\n }\n }\n`\n", "import * as React from 'react'\nimport * as formik from 'formik'\nimport styled from 'styled-components'\n\nimport * as plume from '@ulule/owl-kit-components/next'\nimport * as model from '@owl-nest/models'\nimport * as api from '@owl-nest/api-client/latest'\nimport { t, tf } from '@owl-nest/localize'\n\nimport * as UFE from '../../../../UFE'\n\nimport { useStep, getStepIndex, getStepProgress, Step } from '../useStep'\nimport { Progress } from '../components/Progress'\nimport { Coaching } from '../components/Coaching'\nimport { Actions } from '../components/Actions'\nimport { Tip } from '../components/Tip'\n\nimport { SolidContent } from './styles'\n\ntype TrainingProps = {\n project: model.project.ProjectForOwner\n}\n\nexport function Training({ project }: TrainingProps): React.ReactElement {\n const { setStepValue } = useStep(project)\n\n return (\n <>\n <Progress\n progress={getStepProgress(Step.TRAINING)}\n step={getStepIndex(Step.TRAINING)}\n name={t('Discover our courses')}\n />\n <Coaching project={project}>\n {t('Would you like to know more about our online courses including personalized coaching and group workshops?')}\n </Coaching>\n <formik.Formik\n initialValues={{\n 'create-my-company': false,\n crowdfunding: false,\n 'webmarketing-digital': false,\n }}\n onSubmit={(values) => {\n setStepValue({\n training_types: (Object.entries(values) as [api.TrainingType, boolean][]).reduce(\n (trainingType, [key, value]) => {\n if (value) {\n trainingType.push(key)\n }\n return trainingType\n },\n [] as api.TrainingType[],\n ),\n })\n }}\n validateOnChange={false}\n validateOnBlur={false}\n >\n {(formikBag) => {\n return (\n <Form onSubmit={formikBag.handleSubmit}>\n <StyledSolidContent>\n <formik.Field name=\"create-my-company\">\n {({ field }: formik.FieldProps<boolean>) => {\n return (\n <plume.CheckboxField\n checked={field.value}\n {...field}\n value={field.name}\n label={t('\"Create and launch your business\" course')}\n />\n )\n }}\n </formik.Field>\n <formik.Field name=\"webmarketing-digital\">\n {({ field }: formik.FieldProps<boolean>) => {\n return (\n <plume.CheckboxField\n checked={field.value}\n {...field}\n value={field.name}\n label={t('\"Digital webmarketing\" course')}\n />\n )\n }}\n </formik.Field>\n <formik.Field name=\"crowdfunding\">\n {({ field }: formik.FieldProps<boolean>) => {\n return (\n <plume.CheckboxField\n checked={field.value}\n {...field}\n value={field.name}\n label={t('\"Crowdfunding\" course')}\n />\n )\n }}\n </formik.Field>\n <formik.Field name=\"professional-coaching\">\n {({ field }: formik.FieldProps<boolean>) => {\n return (\n <plume.CheckboxField\n checked={field.value}\n {...field}\n value={field.name}\n label={t('Professional coaching')}\n />\n )\n }}\n </formik.Field>\n\n <Cpf>\n <plume.styles.copy.S>\n {t(\n 'All our courses are 100% eligible for public funds for professional training (CPF, P\u00F4le Emploi, OPCO...).',\n )}\n </plume.styles.copy.S>\n <img src={UFE.IMAGES.cpf} />\n </Cpf>\n </StyledSolidContent>\n\n <Tip>{tf(\"L'\u00E9quipe Formation prendra directement contact avec vous.\")}</Tip>\n <Actions>\n <plume.LinkAsButton kind=\"secondary\" type=\"button\" onClick={() => setStepValue()}>\n {t('Skip')}\n </plume.LinkAsButton>\n <plume.Button kind=\"primary\">{t('Next')}</plume.Button>\n </Actions>\n </Form>\n )\n }}\n </formik.Formik>\n </>\n )\n}\n\nconst StyledSolidContent = styled(SolidContent)`\n @media not screen and ${plume.BREAKPOINTS.TABLET} {\n overflow: auto;\n }\n`\n\nconst Cpf = styled.div`\n align-items: center;\n background: ${plume.COLORS.PRIMARY_SAND_100};\n border: 1px solid ${plume.COLORS.PRIMARY_SAND_100};\n display: flex;\n position: relative;\n padding: 16px 14px 16px 16px;\n overflow: hidden;\n margin-top: 32px;\n\n max-width: 600px;\n margin-left: auto;\n margin-right: auto;\n\n &::before {\n content: '';\n display: block;\n position: absolute;\n right: -30px;\n height: 200%;\n width: 160px;\n background: ${plume.COLORS.PRIMARY_GREY_000};\n top: -50%;\n transform: rotate(15deg);\n }\n\n img {\n height: 48px;\n z-index: 1;\n }\n\n ${plume.styles.copy.S} {\n margin-right: 40px;\n }\n`\n\nconst Form = styled.form`\n height: calc(100% - (132px + 4 * 22px));\n\n ${plume.CheckboxField} {\n max-width: 400px;\n margin-left: auto;\n margin-right: auto;\n margin-bottom: 16px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n`\n", "import * as React from 'react'\nimport * as formik from 'formik'\nimport styled from 'styled-components'\n\nimport * as plume from '@ulule/owl-kit-components/next'\nimport * as model from '@owl-nest/models'\nimport { t } from '@owl-nest/localize'\n\nimport { useStep, getStepIndex, getStepProgress, Step } from '../useStep'\nimport { Progress } from '../components/Progress'\nimport { Coaching } from '../components/Coaching'\nimport { Actions } from '../components/Actions'\nimport { Tip } from '../components/Tip'\n\nimport { SolidContent } from './styles'\n\ntype SlugProps = {\n project: model.project.ProjectForOwner\n}\n\nexport function Slug({ project }: SlugProps): React.ReactElement {\n const { setStepValue } = useStep(project)\n\n return (\n <>\n <Progress progress={getStepProgress(Step.SLUG)} step={getStepIndex(Step.SLUG)} name={t('Your project\u2019s title')} />\n <Coaching project={project}>\n {t(\n 'Give your project a title. A good title should be neither too long nor too short, try to be punchy and use keywords.',\n )}\n </Coaching>\n\n <formik.Formik\n initialValues={{\n slug: '',\n }}\n onSubmit={(values) => {\n const slug = values.slug\n setStepValue(slug ? { name: { [project.lang]: slug }, slugify: true } : {})\n }}\n >\n {(formikBag) => {\n return (\n <Form onSubmit={formikBag.handleSubmit}>\n <SolidContent>\n <formik.Field name=\"slug\">\n {({ field }: formik.FieldProps<string>) => {\n return <plume.TextField label={t('Title of your project')} maxLength={60} {...field} />\n }}\n </formik.Field>\n </SolidContent>\n\n <Tip>{t('Nothing final, you can edit this information later.')}</Tip>\n <Actions>\n <plume.LinkAsButton kind=\"secondary\" type=\"button\" onClick={() => setStepValue()}>\n {t('Skip')}\n </plume.LinkAsButton>\n <plume.Button kind=\"primary\">{t('Next')}</plume.Button>\n </Actions>\n </Form>\n )\n }}\n </formik.Formik>\n </>\n )\n}\n\nconst Form = styled.form`\n height: calc(100% - (132px + 4 * 22px));\n\n ${plume.TextField} {\n max-width: 600px;\n margin-left: auto;\n margin-right: auto;\n }\n`\n", "import * as React from 'react'\nimport styled from 'styled-components'\n\nimport * as model from '@owl-nest/models'\nimport * as plume from '@ulule/owl-kit-components/next'\n\nimport { useStep } from './useStep'\nimport { Progress } from './components/Progress'\n\ntype LayoutProps = {\n project: model.project.ProjectForOwner\n children: React.ReactNode\n withProgress?: boolean\n}\n\nexport function Layout({ project, children, withProgress = true }: LayoutProps) {\n const { step } = useStep(project)\n\n return (\n <OnboardingModal lockScroll open={step !== undefined} withProgress={withProgress}>\n {children}\n </OnboardingModal>\n )\n}\n\nconst OnboardingModal = styled(plume.Modal)<{ withProgress: boolean }>`\n ${plume.styles.modal.Body} {\n height: calc(100% - 162px);\n\n @media screen and ${plume.BREAKPOINTS.TABLET} {\n height: unset;\n }\n }\n\n ${plume.styles.modal.Wrapper} {\n &::before {\n background: transparent;\n height: ${({ withProgress }) => (withProgress ? 60 : 0)}px;\n }\n\n @media screen and ${plume.BREAKPOINTS.TABLET} {\n border-radius: 8px;\n overflow: hidden;\n width: 60vw;\n max-width: 800px;\n max-height: 90vh;\n }\n\n ${Progress} {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n }\n }\n`\n", "import { ApiResponse, RequestFailure } from '@owl-nest/api-client'\nimport * as api from '@owl-nest/api-client/latest'\nimport { PromiseAction } from '@owl-nest/redux-wrapper'\nimport { RootState } from '../reducers'\n\nexport enum ACTION_TYPE {\n LOAD_CHANNELS_REQUEST = 'LOAD_CHANNELS_REQUEST',\n LOAD_CHANNELS_SUCCESS = 'LOAD_CHANNELS_SUCCESS',\n LOAD_CHANNELS_FAILURE = 'LOAD_CHANNELS_FAILURE',\n}\n\ntype LoadChannelsFailure = { type: ACTION_TYPE.LOAD_CHANNELS_FAILURE; failure: RequestFailure }\ntype LoadChannelsRequest = { type: ACTION_TYPE.LOAD_CHANNELS_REQUEST }\ntype LoadChannelsSuccess = {\n type: ACTION_TYPE.LOAD_CHANNELS_SUCCESS\n success: api.Pageable<api.ChannelList> & { forceClean: boolean }\n}\n\ntype LoadConfig = { pagination?: string; forceClean?: boolean }\n\nexport function loadProjectChannels(\n projectId: number,\n { pagination = undefined, forceClean = false }: LoadConfig = {},\n): PromiseAction<RootState, ApiResponse<api.Pageable<api.ChannelList> & { forceClean: boolean }>> {\n const search = new URLSearchParams(pagination)\n search.set('project_id', projectId.toString())\n\n return {\n types: [ACTION_TYPE.LOAD_CHANNELS_REQUEST, ACTION_TYPE.LOAD_CHANNELS_SUCCESS, ACTION_TYPE.LOAD_CHANNELS_FAILURE],\n promise: async (_, state) => {\n const response = await api.api.get.channels({\n urlParams: { projectId: projectId.toString() },\n getParams: search,\n withToken: state.user.identity.type === 'loggedin',\n })\n return response.next(success => ({ ...success.body, forceClean }))\n },\n }\n}\n\nexport type ChannelAction = LoadChannelsRequest | LoadChannelsSuccess | LoadChannelsFailure\n"], "mappings": "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", "names": ["init_define_process_env", "init_sentry_release_injection_stub", "React", "init_define_process_env", "init_sentry_release_injection_stub", "detect", "prop", "value", "prefixes", "mStyle", "positionSticky", "memoize", "init_define_process_env", "init_sentry_release_injection_stub", "params", "colors_exports", "zindex_exports", "confettiPromise", "renderConfetti", "canvas", "end", "confetti", "interval", "confettiParams", "__spreadProps", "__spreadValues", "init_define_process_env", "init_sentry_release_injection_stub", "init_define_process_env", "init_sentry_release_injection_stub", "React", "useStickyFromContext", "contextRef", "top", "state", "setState", "onScroll", "contextBox", "init_define_process_env", "init_sentry_release_injection_stub", "_a", "_b", "stickyContext", "StickyComponent", "sticky", "fallbackToSticky", "src_default", "__template", "status", "$offset", "positionSticky", "css", "init_define_process_env", "init_sentry_release_injection_stub", "backgrounds_exports", "__export", "Waves", "init_define_process_env", "init_sentry_release_injection_stub", "init_define_process_env", "init_sentry_release_injection_stub", "React", "Waves", "WavesContainer", "WavesSvg", "_a", "src_default", "__template", "_b", "breakpoints_exports", "modals_exports", "__export", "FollowProject", "Nsfw", "ShareProject", "init_define_process_env", "init_sentry_release_injection_stub", "init_define_process_env", "init_sentry_release_injection_stub", "React", "FollowProject", "isOpen", "onClose", "auth", "user_exports", "ModalWithIcon", "illustrations_exports", "ModalContent", "styles_exports", "Button", "Link", "nextAwareURL", "SIGNIN_URL", "SIGNUP_URL", "url", "params", "searchParams_exports", "_a", "src_default", "__template", "_b", "init_define_process_env", "init_sentry_release_injection_stub", "React", "Nsfw", "onBack", "projectId", "projectName", "projectSlug", "useModalInitialValue", "isOpen", "setIsOpen", "useModal", "hooks_exports", "isClientSide", "useClientSide", "isMobile", "utils_exports", "ModalWithIcon", "setCookie", "illustrations_exports", "Heading", "styles_exports", "_a", "src_default", "__template", "breakpoints_exports", "ModalIconWrapper", "colors_exports", "_b", "init_define_process_env", "init_sentry_release_injection_stub", "React", "ProjectWidgetPreview", "ShareProject", "props", "auth", "user_exports", "UserWiredShareProject", "__spreadProps", "__spreadValues", "closable", "enableConfetti", "enableWidget", "modalButtons", "modalHero", "styles_exports", "modalId", "modalPastille", "illustrations_exports", "utils_exports", "project", "publicUser", "sharingContext", "trackingConfig", "withCallout", "canCopy", "copy", "copyStatus", "useCopy", "shareTo", "useSharing", "tracking", "useTracking", "isProjectDetailShareModalOpen", "setIsProjectDetailShareModalOpen", "useModal", "isWidgetOpen", "setIsWidgetOpen", "hooks_exports", "canvas", "renderConfetti", "projectURL", "getSharingURL", "ModalWithIcon", "OverflowWrapper", "CanvasConfetti", "Copy", "TextField", "LinkAsButton", "track", "glyphs_exports", "Tooltip", "Links", "Link", "Spinner", "Widget", "kind", "_a", "src_default", "__template", "_b", "_c", "_d", "colors_exports", "breakpoints_exports", "open", "css", "_e", "theme", "_f", "_g", "init_define_process_env", "init_sentry_release_injection_stub", "React", "init_define_process_env", "init_sentry_release_injection_stub", "React", "PreviewBar", "project", "useSelector", "state", "dispatch", "useDispatch", "search", "useLocation", "previousEditionPath", "project_exports", "shareProject", "toggleShareOverlay", "init_define_process_env", "init_sentry_release_injection_stub", "React", "init_define_process_env", "init_sentry_release_injection_stub", "React", "init_define_process_env", "init_sentry_release_injection_stub", "React", "init_define_process_env", "init_sentry_release_injection_stub", "useOnboardingStep", "project", "namespace", "setOnboardingSteps", "_a", "currentSteps", "setOnboardingStep", "name", "value", "extra", "nextSteps", "__spreadProps", "__spreadValues", "useLilSam", "namespace", "project", "rule", "dependencies", "updateSteps", "_a", "currentSteps", "setOnboardingStep", "useOnboardingStep", "rulePromise", "awaited", "useAwait", "_a", "FixedWrapper", "src_default", "__template", "breakpoints_exports", "LilSamComponent", "className", "namespace", "project", "rule", "updateSteps", "lilSam", "useLilSam", "_b", "LilSam", "init_define_process_env", "init_sentry_release_injection_stub", "init_define_process_env", "init_sentry_release_injection_stub", "React", "init_define_process_env", "init_sentry_release_injection_stub", "init_define_process_env", "init_sentry_release_injection_stub", "React", "_a", "CoachWrapper", "src_default", "__template", "styles_exports", "effects_exports", "_b", "CoachModal", "SmallModal", "LinkAsButton", "breakpoints_exports", "titleBackgroundColor", "colors_exports", "CoachComponent", "children", "className", "closable", "onClose", "open", "title", "_c", "Coach", "init_define_process_env", "init_sentry_release_injection_stub", "React", "NotificationWrapper", "src_default", "styles_exports", "__template", "effects_exports", "colors_exports", "breakpoints_exports", "NotificationComponent", "avatar", "children", "className", "onClick", "_b", "Notification", "init_define_process_env", "init_sentry_release_injection_stub", "React", "_a", "SimpleModalWrapper", "src_default", "__template", "_b", "SimpleModalContent", "Modal", "styles_exports", "SimpleModalComponent", "buttons", "children", "className", "closable", "onClose", "open", "_c", "SimpleModal", "_a", "Coach", "src_default", "__template", "styles_exports", "Accepted", "project", "markStepDone", "initialOpen", "manager", "open", "setIsOpen", "managerAvatar", "image_exports", "Notification", "goToDiscussion", "handleDone", "init_define_process_env", "init_sentry_release_injection_stub", "React", "ComingSoon", "project", "markStepSeen", "dispatch", "useDispatch", "manager", "open", "setIsOpen", "SimpleModal", "handleDone", "openShareOverlay", "styles_exports", "toggleShareOverlay", "_a", "CallToAction", "src_default", "Button", "__template", "init_define_process_env", "init_sentry_release_injection_stub", "React", "Examples", "initialOpen", "project", "markStepDone", "manager", "open", "setIsOpen", "dispatch", "useDispatch", "mainTag", "category", "i18n_exports", "Coach", "handleDone", "image_exports", "styles_exports", "Button", "goToDiscussion", "LinkAsButton", "delay", "computeExample", "withDelay", "isProjectOnline", "computeExamples", "init_define_process_env", "init_sentry_release_injection_stub", "React", "_a", "Wrapper", "src_default", "Notification", "__template", "Message", "project", "sender", "image_exports", "goToDiscussion", "init_define_process_env", "init_sentry_release_injection_stub", "React", "_a", "Coach", "src_default", "__template", "VideoLoader", "Button", "OffboardingFunded", "initialOpen", "project", "markStepSeen", "manager", "open", "setIsOpen", "managerAvatar", "image_exports", "handleDone", "styles_exports", "goToOffboarding", "LinkAsButton", "init_define_process_env", "init_sentry_release_injection_stub", "React", "_a", "OffboardingFundedWrapper", "src_default", "Coach", "__template", "VideoLoader", "Button", "OffboardingSuccess", "project", "markStepSeen", "initialOpen", "manager", "open", "setIsOpen", "managerAvatar", "image_exports", "handleDone", "styles_exports", "goToOffboarding", "LinkAsButton", "init_define_process_env", "init_sentry_release_injection_stub", "React", "_a", "Wrapper", "src_default", "Coach", "__template", "styles_exports", "Submit", "project", "markStepDone", "initialOpen", "dispatch", "useDispatch", "manager", "open", "setIsOpen", "managerAvatar", "image_exports", "storeSubmitConfirmationHandler", "handleClose", "handleSubmit", "Button", "toggleModalSubmitForReview", "LinkAsButton", "SubmitModal", "onClose", "onSubmit", "ProjectSubmissionModal", "values", "submit", "init_define_process_env", "init_sentry_release_injection_stub", "React", "Preview", "project", "markStepSeen", "dispatch", "useDispatch", "manager", "open", "setIsOpen", "SimpleModal", "handleDone", "openShareOverlay", "styles_exports", "toggleShareOverlay", "init_define_process_env", "init_sentry_release_injection_stub", "React", "_a", "Coach", "src_default", "__template", "styles_exports", "colors_exports", "Button", "Validated", "project", "initialOpen", "markStepDone", "manager", "open", "setIsOpen", "managerAvatar", "image_exports", "handleDone", "user_exports", "goToPublish", "LinkAsButton", "goToDiscussion", "init_define_process_env", "init_sentry_release_injection_stub", "React", "VIDEO_ID", "_a", "Coach", "src_default", "__template", "VideoLoader", "Welcome", "project", "markStepDone", "initialOpen", "manager", "video", "project_exports", "i18n_exports", "VIDEOS", "videoHtml", "videoPlaceholder", "open", "setIsOpen", "playerRef", "handleDone", "image_exports", "styles_exports", "handleVidoClick", "media_exports", "LinkAsButton", "onPlayerStateChange", "state", "init_define_process_env", "init_sentry_release_injection_stub", "React", "ONBOARDING_NAMESPACE", "COMMUNITY_NAMESPACE", "STEP_ORDER", "STEP_NAMESPACES", "ONBOARDING_NAMESPACE", "COMMUNITY_NAMESPACE", "isGlobalDone", "getStepIndex", "step", "index", "getStepProgress", "useStep", "project", "dispatch", "useDispatch", "steps", "computeSteps", "getCurrentStep", "isMembership", "project_exports", "setOnboardingStep", "useOnboardingStep", "nextSteps", "extra", "isDone", "update", "__spreadProps", "__spreadValues", "endCallback", "setImportCommunityStep", "setStepValue", "renderConfetti", "value", "_a", "_b", "_c", "_d", "markedSteps", "lastStepIndex", "stepIndex", "currentStepKey", "LilSam", "dispatch", "useDispatch", "project", "useSelector", "state", "discussionThread", "location", "useLocation", "auth", "useAuth", "user", "isOnboardingDone", "useStep", "onboarding_steps", "update", "steps", "setStep", "content", "isPreview", "Message", "Validated", "resolve", "Welcome", "Accepted", "Examples", "project_exports", "Submit", "offboardingSuccess", "OffboardingSuccess", "offboardingFunded", "OffboardingFunded", "Preview", "ComingSoon", "_a", "currentTimestamp", "sevenDaysNumeral", "twentyFourHourNumeral", "littleSamLastDisplayDate", "remaingTimeToProjectEndDate", "postCampaignUrl", "date", "sixMonthAgoTimestamp", "projectEndDateTimestamp", "HeaderLayoutComponent", "headerRef", "className", "isHeaderSticky", "_a", "project", "useSelector", "state", "role", "project_exports", "CURRENT_USER", "userConfig", "useUserEnv", "stickyRefHeader", "displayMode", "useDisplayMode", "isEditMode", "breakpoint", "EDIT_MODE_TABLET_BREAKPOINT", "breakpoints_exports", "isTablet", "useDramaticallyInefficientMediaQuery", "auth", "useAuth", "isOwner", "backgroundColor", "theme", "colors_exports", "setRef", "node", "HeaderWrapper", "PreviewBar", "Header", "ConfiguredNavMenu", "BannerContainer", "message", "HiddenOnSticky", "LilSam", "HeaderLayout", "src_default", "__template", "_b", "PM_MENU_WIDTH", "_c", "_d", "_e", "zindex_exports", "isHidden", "css", "_f", "style_exports", "Wrapper", "init_define_process_env", "init_sentry_release_injection_stub", "React", "init_define_process_env", "init_sentry_release_injection_stub", "React", "DonationBlock", "context", "project", "withFromMention", "isDonationBasedProject", "project_exports", "allowedFrequency", "dispatch", "useDispatch", "tracking", "useTracking", "TipWrapper", "styles_exports", "StyledTip", "values", "getCheckoutURL", "toggleModalPaymentDisturbance", "_a", "src_default", "Tip", "__template", "InputWrapper", "Button", "TipContainerWrapper", "_b", "colors_exports", "init_define_process_env", "init_sentry_release_injection_stub", "React", "Heading", "children", "project", "useSelector", "state", "isEditMode", "DisplayMode", "project_exports", "userConfig", "useUserEnv", "titleAndSubtitle", "Title", "styles_exports", "editView", "EditButtonWrapper", "EditButton", "EditViewStyled", "CreateButton", "AdviceLinkWrapper", "Link", "getAdviceURL", "glyphs_exports", "HeadingWrapper", "Content", "lang", "url", "_a", "src_default", "__template", "breakpoints_exports", "MIDDLE_TABLET_LAPTOP_BREAKPOINT", "_b", "_c", "_d", "_e", "_f", "init_define_process_env", "init_sentry_release_injection_stub", "React", "LiveEvents", "socket", "_a", "_b", "navigation", "useNavigation", "indexToShow", "setIndexToShow", "fade", "setFade", "indexEventKeys", "useInterval", "changeEventShowed", "eventToTemplate", "templatedEvent", "templateEvent", "LiveNews", "FLAGS", "nbEvent", "event", "_c", "_d", "_e", "_f", "_g", "_h", "lastEventIndex", "styles_exports", "Link", "glyphs_exports", "PATHS", "formatDistanceToNow", "src_default", "__template", "breakpoints_exports", "init_define_process_env", "init_sentry_release_injection_stub", "React", "OwnerComponent", "className", "_a", "project", "useSelector", "state", "mainTag", "project_exports", "navigation", "useNavigation", "avatar", "user_exports", "isEditMode", "useDisplayMode", "handleClick", "PATHS", "InfoCard", "InfoCardItem", "styles_exports", "InfoCardContent", "InfoCardTags", "InfoCardTag", "glyphs_exports", "Link", "Owner", "src_default", "__template", "_b", "_c", "colors_exports", "_d", "breakpoints_exports", "MIDDLE_TABLET_LAPTOP_BREAKPOINT", "_e", "_f", "init_define_process_env", "init_sentry_release_injection_stub", "React", "PartnerRibbon", "ribbonRef", "project", "useSelector", "state", "partnerRibbonData", "project_exports", "isEditMode", "DisplayMode", "usePartnershipTracker", "Ribbon", "_a", "src_default", "__template", "backgroundUrl", "breakpoints_exports", "MIDDLE_TABLET_LAPTOP_BREAKPOINT", "init_define_process_env", "init_sentry_release_injection_stub", "React", "PrimaryMedia", "project", "useSelector", "state", "media", "useProjectMedia", "userConfig", "useUserEnv", "displayMode", "DisplayMode", "isAdviceModalOpen", "setAdviceModalOpen", "isImageModalOpen", "setImageModalOpen", "isEditMode", "PrimaryMediaView", "project_exports", "CreateWrapper", "CreateButton", "LinkWrapper", "Link", "glyphs_exports", "CreateTitle", "styles_exports", "EditButtonContainer", "EditButton", "Callout", "StyledVideoLoader", "media_exports", "Image", "getEditButtons", "AdviceModal", "IMAGES", "AdviceVideoEditButton", "AdviceVideo", "LinkAsButton", "_a", "_b", "x2Image", "largeImage", "videoHtml", "src_default", "__template", "EDIT_MODE_LAPTOP_BREAKPOINT", "_c", "breakpoints_exports", "_d", "colors_exports", "MIDDLE_TABLET_LAPTOP_BREAKPOINT", "_e", "_f", "_g", "_h", "VideoLoader", "_i", "_j", "_k", "css", "init_define_process_env", "init_sentry_release_injection_stub", "React", "init_define_process_env", "init_sentry_release_injection_stub", "React", "init_define_process_env", "init_sentry_release_injection_stub", "React", "_a", "DiptychView", "src_default", "__template", "breakpoints_exports", "styles_exports", "DiptychComponent", "handlers", "leftZone", "rightZone", "className", "_b", "Diptych", "init_define_process_env", "init_sentry_release_injection_stub", "React", "AnimateCounter", "children", "id", "state", "setState", "animatedRef", "childrenRef", "currentIdRef", "onTransitionEnd", "Wrapper", "AnimatedExit", "AnimatedEnter", "_a", "exitTop", "keyframes", "__template", "_b", "enterBottom", "_c", "src_default", "_d", "_e", "Orders", "ordersCount", "navigation", "useNavigation", "project", "useSelector", "state", "Diptych", "PATHS", "styles_exports", "user_exports", "Content", "AnimateCounter", "text_exports", "_a", "src_default", "__template", "init_define_process_env", "init_sentry_release_injection_stub", "React", "Supporters", "supportersCount", "navigation", "useNavigation", "project", "useSelector", "state", "Diptych", "PATHS", "styles_exports", "user_exports", "Content", "AnimateCounter", "text_exports", "_a", "src_default", "__template", "init_define_process_env", "init_sentry_release_injection_stub", "React", "DateInfo", "_a", "project", "useSelector", "state", "endDate", "project_exports", "startDate", "isTooltipOpen", "setToolTipOpen", "eventHandlers", "remainingDays", "Diptych", "styles_exports", "format", "Content", "formattedEndDate", "formattedEndTime", "formattedStartDate", "remainingTime", "useDateCountdown", "isFinished", "DiptychStyled", "getPicto", "getDescription", "glyphs_exports", "getRelativeEndDate", "differenceInCalendarDays", "_b", "src_default", "__template", "extraTime", "css", "breakpoints_exports", "_c", "_d", "column", "init_define_process_env", "init_sentry_release_injection_stub", "React", "init_define_process_env", "init_sentry_release_injection_stub", "React", "_a", "DescriptionInfo", "src_default", "styles_exports", "__template", "breakpoints_exports", "_b", "_c", "RightColumn", "centerSelf", "css", "_d", "TriptychView", "TriptychComponent", "description", "handlers", "leftZone", "title", "className", "_e", "Triptych", "Progress", "percent", "amountRaised", "committed", "goal", "project", "useSelector", "state", "displayMode", "DisplayMode", "userCurrency", "getUserConfig", "userLocale", "conversionNeeded", "ConversionIcon", "getCurrencyIcon", "isPresale", "isDonationBased", "project_exports", "isEditMode", "isFinishedAndFunded", "ProgressView", "FinishedAndFundedLabel", "Triptych", "ProgressDescription", "illustrations_exports", "glyphs_exports", "GoalWrapper", "styles_exports", "AnimateCounter", "text_exports", "MoneyDisplayer", "CURRENCIES_RATES", "ConversionWrapper", "LocaleMoneyDisplayer", "EditButtonContainer", "EditButton", "precision", "Tag", "ConversionWrapperGoal", "currency", "iconName", "_a", "src_default", "__template", "breakpoints_exports", "_b", "MIDDLE_TABLET_LAPTOP_BREAKPOINT", "_c", "_d", "colors_exports", "_e", "_f", "_g", "RoleTag", "Statistics", "project", "useSelector", "state", "stats", "setStats", "project_exports", "previousPercent", "setPreviousPercent", "poller", "usePoll", "url", "LIVE_URL", "base", "data", "request", "goal", "FLAGS", "renderConfetti", "displayDateInfo", "Progress", "Line", "Orders", "Supporters", "DateInfo", "split", "_a", "src_default", "__template", "breakpoints_exports", "init_define_process_env", "init_sentry_release_injection_stub", "React", "SocialActions", "project", "useSelector", "state", "isFailure", "project_exports", "isProjectDetailShareModalOpen", "setIsProjectDetailShareModalOpen", "useModal", "auth", "user_exports", "tracking", "useTracking", "projectURL", "getSharingURL", "SocialActionsView", "ActionButtonWrapper", "ActionButton", "utils_exports", "glyphs_exports", "FollowProjectButton", "_a", "src_default", "__template", "breakpoints_exports", "_b", "centeredButton", "init_define_process_env", "init_sentry_release_injection_stub", "React", "SponsorsComponent", "className", "project", "useSelector", "state", "indexActive", "setIndexActive", "sponsors", "sponsorship", "sponsorship_exports", "SponsorshipTag", "timer", "newIndex", "InfoCardWrapper", "InfoCard", "sponsor", "index", "AnimatedCard", "Sponsor", "_a", "Sponsors", "src_default", "__template", "navigation", "useNavigation", "sponsorRef", "usePartnershipTracker", "SponsorWrapper", "styles_exports", "InfoCardItem", "PATHS", "InfoCardContent", "_b", "active", "_c", "breakpoints_exports", "_d", "colors_exports", "_e", "_f", "_g", "init_define_process_env", "init_sentry_release_injection_stub", "React", "init_define_process_env", "init_sentry_release_injection_stub", "React", "Share", "project", "user", "canCopy", "copy", "copyStatus", "useCopy", "tracking", "useTracking", "shareTo", "useSharing", "SharesContainer", "InformationContainer", "styles_exports", "illustrations_exports", "Buttons", "Link", "share", "glyphs_exports", "Tooltip", "projectURL", "getSharingURL", "plateform", "_a", "src_default", "__template", "breakpoints_exports", "_b", "iconMargin", "css", "_c", "colors_exports", "_d", "_e", "init_define_process_env", "init_sentry_release_injection_stub", "React", "ProjectFinanced", "project", "fullSize", "_a", "_b", "userConfig", "useUserEnv", "ProjectFinancedContainer", "InformationContainer", "styles_exports", "illustrations_exports", "user_exports", "project_exports", "_c", "src_default", "__template", "breakpoints_exports", "css", "_d", "_e", "init_define_process_env", "init_sentry_release_injection_stub", "React", "ProjectCancelled", "project", "ProjectCancelledContainer", "styles_exports", "project_exports", "Avatar", "user_exports", "_a", "src_default", "__template", "breakpoints_exports", "_b", "init_define_process_env", "init_sentry_release_injection_stub", "React", "ProjectFinancedOffboarding", "project", "fullSize", "_a", "_b", "_c", "_d", "offboardingType", "tracking", "useTracking", "boutiqueLink", "postCampaignUrl", "button", "user_exports", "ProjectFinancedContainer", "InformationContainer", "styles_exports", "illustrations_exports", "searchParams_exports", "track", "ShopCTA", "Link", "glyphs_exports", "src_default", "__template", "breakpoints_exports", "css", "_e", "_f", "init_define_process_env", "init_sentry_release_injection_stub", "React", "ProjectFinishedDonationBased", "project", "fullSize", "_a", "_b", "_c", "_d", "_e", "_f", "offboardingType", "tracking", "useTracking", "userConfig", "useUserEnv", "boutiqueLink", "postCampaignUrl", "hasOnboarding", "button", "user_exports", "ProjectFinishedDonationBasedContainer", "InformationContainer", "styles_exports", "illustrations_exports", "searchParams_exports", "track", "ShopCTA", "Link", "glyphs_exports", "project_exports", "src_default", "__template", "breakpoints_exports", "css", "init_define_process_env", "init_sentry_release_injection_stub", "React", "ProjectNotFinanced", "project", "ProjectNotFinancedContainer", "InformationContainer", "styles_exports", "illustrations_exports", "_a", "src_default", "__template", "breakpoints_exports", "_b", "init_define_process_env", "init_sentry_release_injection_stub", "React", "init_define_process_env", "init_sentry_release_injection_stub", "React", "init_define_process_env", "init_sentry_release_injection_stub", "React", "RewardList", "displayDetail", "skuList", "subtitle", "title", "isExpanded", "setIsExpanded", "additionalCost", "RewardListContainer", "Rewards", "OpenDetails", "toggleIsExpanded", "styles_exports", "glyphs_exports", "RewardsListDetail", "sku", "i", "RewardsListItem", "RewardQuantity", "RewardTitle", "sku_exports", "MoneyDisplayer", "_a", "src_default", "__template", "_b", "props", "_c", "_d", "_e", "_f", "_g", "Contribution", "project", "order", "project_exports", "Donation", "status", "orderStatus", "deliveryType", "renewCopy", "skuList", "orderItem", "sku_exports", "sku", "isMonoReward", "isTipOnly", "areSomeRewardLegacy", "reward_exports", "displayDetail", "ContributionBlock", "RewardInformations", "RewardBlock", "RewardPrice", "MoneyDisplayer", "RewardList", "title", "subtitle", "styles_exports", "formattedDeliveryDate", "LinkToContribution", "glyphs_exports", "Callout", "Link", "_a", "isFinishedAndRecurrent", "Frequency", "format", "_b", "quantity", "item", "a", "b", "firstSkuItem", "variant_exports", "deduplicateAndSortByDeliveryDate", "rewards", "seen", "deduplicated", "reward", "date", "dateA", "dateB", "rewardsDeduplicatedAndSortedByDeliveryDate", "src_default", "__template", "colors_exports", "breakpoints_exports", "_c", "_d", "_e", "_f", "props", "css", "_g", "ContributionsBlock", "project", "isOpen", "orders", "auth", "useAuth", "userId", "ContributionsContainer", "InformationContainer", "styles_exports", "illustrations_exports", "ResponsiveWrapper", "ShrinkContributions", "order", "i", "Contribution", "ShowContributions", "Link", "LinkContainer", "_a", "src_default", "__template", "breakpoints_exports", "_b", "_c", "_d", "colors_exports", "_e", "_f", "props", "BackersBlock", "status", "_a", "isOpen", "setIsOpen", "toggle", "project", "useSelector", "state", "auth", "user_exports", "isUserSupporter", "isEditMode", "DisplayMode", "Main", "Layout", "ProjectNotFinanced", "ProjectFinancedOffboarding", "ContributionsBlock", "ProjectFinishedDonationBased", "ProjectFinanced", "ProjectCancelled", "utils_exports", "Share", "display", "children", "Wrapper", "ContentContainer", "ShowDetails", "glyphs_exports", "useBlockStatus", "isProjectSuccess", "project_exports", "isDonationBased", "isFinished", "isCancelled", "hasOnboarding", "src_default", "__template", "breakpoints_exports", "_b", "colors_exports", "effects_exports", "IMAGES", "_c", "_d", "styles_exports", "props", "css", "_e", "init_define_process_env", "init_sentry_release_injection_stub", "React", "useLiveEventsSocket", "project", "useSelector", "state", "userPermissions", "userCantUpdate", "eventTypes", "liveEventsSocketReturn", "useSocket", "LIVE_PROJECT_URL", "HeroHeader", "_a", "_b", "dispatch", "useDispatch", "project", "useSelector", "state", "isEditMode", "DisplayMode", "userConfig", "useUserEnv", "liveEventsSocketReturn", "useLiveEventsSocket", "tracker", "useTracking", "isDesktopOrLaptop", "useMediaQuery", "breakpoints_exports", "MIDDLE_TABLET_LAPTOP_BREAKPOINT", "isAdviceModalOpen", "setAdviceModalOpen", "isSecurePaymentModalOpen", "setSecurePaymentModalOpen", "backgroundColor", "project_exports", "backgroundImage", "hasBackgroundOrImage", "colors_exports", "isDonationBased", "isFinished", "setIsTaxDeductionModalOpen", "useSetModal", "backersBlockStatus", "useBlockStatus", "isUserSupporter", "isBackerBlockDisplayed", "isSponsorsDisplayed", "isLiveEventsDisplayed", "Wrapper", "BackersBlock", "PrimaryMedia", "PartnerRibbon", "Content", "Heading", "Information", "InformationTorso", "ActionsAndStatisticsEdit", "CreateButton", "styles_exports", "Link", "getAdviceURL", "glyphs_exports", "CreateButtonTitle", "ActionsAndStatistics", "Statistics", "CenteredOnMobile", "InvitationToFollowEndedProject", "SocialActions", "InvitationToDiscoverOtherProjects", "goToMainCategory", "DonationBlock", "ContributionCTAWrapper", "goToCheckout", "MoneyDisplayer", "TaxInfo", "LinkAsButton", "InformationFooter", "Owner", "SponsorsAndEventsContainer", "Sponsors", "LiveEvents", "AdviceModal", "SecurePaymentModal", "getCheckoutURL", "toggleModalPaymentDisturbance", "lang", "url", "_c", "src_default", "__template", "css", "withCTA", "EDIT_MODE_SMALL_LAPTOP", "_d", "_e", "_f", "pullContent", "_g", "_h", "effects_exports", "backerBlockIsActive", "_i", "_j", "_k", "_l", "_m", "_n", "_o", "_p", "_q", "_r", "_s", "EDIT_MODE_TABLET_BREAKPOINT", "PM_MENU_WIDTH", "distance", "_t", "_u", "_v", "init_define_process_env", "init_sentry_release_injection_stub", "React", "MenuComponent", "className", "sticky", "navigation", "useNavigation", "dispatch", "useDispatch", "tracking", "useTracking", "project", "useSelector", "state", "isProjectTab", "PATHS", "projectIsDonationBased", "project_exports", "tooltipOpen", "setTooltipOpen", "toggleTooltip", "value", "MenuPositionner", "MenuContainer", "MenuNav", "TabMenu", "Tab", "TabItem", "Link", "Counter", "Tooltip", "styles_exports", "BackNowCTA", "showOnMobile", "CTAWrapper", "handleBacking", "breakpoints_exports", "getCheckoutURL", "toggleModalPaymentDisturbance", "toggleModalPostCampaign", "_a", "Menu", "src_default", "__template", "_b", "colors_exports", "_c", "_d", "_e", "_f", "_g", "_h", "css", "effects_exports", "zindex_exports", "init_define_process_env", "init_sentry_release_injection_stub", "React", "import_react_dom", "init_define_process_env", "init_sentry_release_injection_stub", "import_react", "nextAwareURL", "url", "params", "searchParams_exports", "FollowProjectModal", "isOpen", "onClose", "userIsAuthenticated", "React", "ModalWithIcon", "illustrations_exports", "ModalContent", "styles_exports", "StyledCallToAction", "Link", "SIGNIN_URL", "SIGNUP_URL", "_a", "src_default", "__template", "_b", "_c", "init_define_process_env", "init_sentry_release_injection_stub", "React", "LaunchShareModal", "project", "href", "search", "urlParams", "setIsProjectDetailLaunchShareModalOpen", "useSetModal", "modalCalloutMessage", "getCalloutMessage", "modals_exports", "newUrl", "ModalTitle", "ModalDescription", "Callout", "illustrations_exports", "utils_exports", "CURRENT_USER", "_a", "_b", "_c", "_d", "src_default", "styles_exports", "__template", "init_define_process_env", "init_sentry_release_injection_stub", "React", "PaymentDisturbanceModalComponent", "className", "dispatch", "useDispatch", "modal", "useSelector", "state", "handleClosing", "toggleModalPaymentDisturbance", "ModalWithIcon", "illustrations_exports", "styles_exports", "CTAWrapper", "FollowProjectButton", "LinkAsButton", "_a", "PaymentDisturbanceModal", "src_default", "__template", "breakpoints_exports", "_b", "init_define_process_env", "init_sentry_release_injection_stub", "React", "init_define_process_env", "init_sentry_release_injection_stub", "import_react", "_a", "Wrapper", "src_default", "__template", "_b", "Title", "styles_exports", "_c", "Text", "_d", "Button", "colors_exports", "PostCampaignModal", "dispatch", "useDispatch", "project", "useSelector", "state", "modal", "tracking", "useTracking", "postCampaignLink", "offboardingType", "boutiqueLink", "handleClosing", "toggleModalPostCampaign", "setRewardId", "previewTranslations", "React", "Modal", "project_exports", "track", "init_define_process_env", "init_sentry_release_injection_stub", "React", "_a", "RewardList", "src_default", "__template", "RewardModal", "dispatch", "useDispatch", "project", "useSelector", "state", "modal", "rewards", "sharedRewardId", "reward", "setReward", "handleClick", "useReward", "trackingSource", "selectedReward", "projectReward", "modeledSelectedReward", "reward_exports", "body", "StyledModal", "toggleModalReward", "setRewardId", "TextContainer", "styles_exports", "user_exports", "BaseReward", "id", "optionValuesIds", "ActionsWrapper", "StyledCallToAction", "project_exports", "getCheckoutURL", "toggleModalPaymentDisturbance", "Link", "event", "_b", "breakpoints_exports", "_c", "Modal", "_d", "_e", "RewardModals", "dispatch", "useDispatch", "project", "useSelector", "state", "modal", "hideRewardModal", "project_exports", "sharedRewardId", "toggleModalPostCampaign", "RewardModal", "PostCampaignModal", "init_define_process_env", "init_sentry_release_injection_stub", "React", "init_define_process_env", "init_sentry_release_injection_stub", "React", "init_define_process_env", "init_sentry_release_injection_stub", "React", "init_define_process_env", "init_sentry_release_injection_stub", "React", "Connect", "Like", "onLoggedIn", "onLike", "handlersRef", "auth", "user_exports", "Wrapper", "ConnectWrapper", "Spinner", "user", "Button", "_a", "src_default", "__template", "_b", "_c", "breakpoints_exports", "loggedinUser", "css", "styles_exports", "init_define_process_env", "init_sentry_release_injection_stub", "React", "SuccessMessage", "auth", "project", "useSelector", "state", "user", "shareTo", "useSharing", "Wrapper", "illustrations_exports", "Texts", "styles_exports", "Share", "ShareText", "SocialButtonList", "SocialButton", "_a", "src_default", "__template", "breakpoints_exports", "_b", "_c", "_d", "colors_exports", "_e", "init_define_process_env", "init_sentry_release_injection_stub", "React", "SplashTitleComponent", "props", "styles_exports", "__spreadValues", "_a", "SplashTitle", "src_default", "__template", "colors_exports", "init_define_process_env", "init_sentry_release_injection_stub", "React", "import_localize", "Title", "Wrapper", "styles_exports", "_a", "src_default", "__template", "breakpoints_exports", "Home", "iframe", "dispatch", "useDispatch", "project", "useSelector", "state", "defaultFollowers", "auth", "useAuth", "tracking", "useTracking", "isUserFan", "setIsUserFan", "isLoading", "setIsLoading", "showTitle", "HomeWrapper", "Title", "Block", "Like", "onLoggedIn", "onLike", "CenterSpinner", "Spinner", "SuccessMessage", "like", "user", "likeProject", "_a", "src_default", "__template", "colors_exports", "breakpoints_exports", "_b", "_c", "_d", "css", "SplashTitle", "styles_exports", "init_define_process_env", "init_sentry_release_injection_stub", "React", "Context", "iframe", "project", "useSelector", "state", "title", "project_exports", "subtitle", "mainImage", "video", "ContextWrapper", "Information", "SplashTitle", "styles_exports", "ProjectVideoContainer", "ProjectVideo", "media_exports", "ProjectImage", "_a", "src_default", "__template", "breakpoints_exports", "colors_exports", "_b", "VideoLoader", "_c", "_d", "_e", "_f", "_g", "hasVideo", "css", "IMAGES", "init_define_process_env", "init_sentry_release_injection_stub", "React", "ComingSoonHeader", "project", "useSelector", "state", "Wrapper", "Owner", "styles_exports", "user_exports", "glyphs_exports", "logos_exports", "_a", "src_default", "__template", "_b", "colors_exports", "breakpoints_exports", "ComingSoon", "auth", "useAuth", "PublicLayout", "ComingSoonWrapper", "ComingSoonHeader", "ComingSoonContent", "LegalTextWrapper", "styles_exports", "Link", "iframe", "MainContent", "Context", "Home", "_a", "_b", "src_default", "__template", "colors_exports", "breakpoints_exports", "css", "_c", "_d", "init_define_process_env", "init_sentry_release_injection_stub", "React", "BrowserScreenshotComponent", "className", "ratio", "children", "href", "Wrapper", "RatioPreserver", "BrowserWrapper", "BrowserBar", "Button", "NavigationBar", "buttonColors", "_a", "src_default", "__template", "type", "colors_exports", "_b", "_c", "_d", "_e", "_f", "_g", "BrowserScreenshot", "ShareOverlay", "canCopy", "copy", "copyStatus", "useCopy", "project", "useSelector", "state", "isShareOverlayOpen", "dispatch", "useDispatch", "navigation", "useNavigation", "canonicalComingSoon", "ShareOverlayModal", "toggleShareOverlay", "Texts", "illustrations_exports", "styles_exports", "Screenshot", "ComingSoonContent", "PATHS", "Link", "openComingSoon", "CopyInput", "Tooltip", "glyphs_exports", "LinkAsButton", "_a", "src_default", "__template", "colors_exports", "_b", "BrowserScreenshot", "breakpoints_exports", "_c", "_d", "OverlayModal", "sizes_exports", "PublicLayout", "children", "dispatch", "useDispatch", "project", "useSelector", "state", "auth", "useAuth", "isOwner", "userIsAuthenticated", "modalFollow", "modalSubmit", "modalVariant", "modalContainerCached", "_a", "ShareOverlay", "RewardModals", "PaymentDisturbanceModal", "FollowProjectModal", "toggleModalFollow", "SubmitModal", "LaunchShareModal", "modals_exports", "TaxDeductionModal", "init_define_process_env", "init_sentry_release_injection_stub", "React", "init_define_process_env", "init_sentry_release_injection_stub", "React", "SuggestedProjectComponent", "project", "className", "_a", "dispatch", "useDispatch", "textFinishProject", "project_exports", "userFollowsProject", "setUserFollowsProject", "followingStatusRef", "shortCountdown", "useDateCountdown", "toggleFollowing", "useProjectFollowing", "action", "getAction", "userCurrency", "getUserConfig", "toggleModalFollow", "CardTypeSelector", "CURRENCIES_RATES", "text_exports", "CURRENT_USER", "SuggestedProject", "src_default", "__template", "isUserLoggedin", "useAuth", "event", "SuggestedProjectsList", "isEditMode", "_a", "_b", "_c", "_d", "auth", "useAuth", "project", "useSelector", "state", "userIsAuthenticated", "breakpoint", "breakpoints_exports", "querySearch", "getQuerySearch", "query", "response", "useQuery", "api", "success", "Content", "Spinner", "styles_exports", "project_exports", "ProjectListItems", "suggestedProject", "SuggestedProject", "Center", "src_default", "__template", "css", "_e", "projectSearchExtraFields", "search", "qualifiers", "params", "withAccessToken", "extraFields", "paramsUrl", "request", "stringifyQualifiers", "name", "key", "value", "init_define_process_env", "init_sentry_release_injection_stub", "React", "init_define_process_env", "init_sentry_release_injection_stub", "React", "init_define_process_env", "init_sentry_release_injection_stub", "extraFields", "init_define_process_env", "init_sentry_release_injection_stub", "React", "init_define_process_env", "init_sentry_release_injection_stub", "formatBacker", "supporter", "project", "_a", "supporterLatestOrder", "firstOrderItem", "firstReward", "orderItem_exports", "hasTip", "dateOrder", "label", "user_exports", "isLegacy", "reward_exports", "isHidden", "item", "reward", "Backer", "supporter", "project", "variant", "source", "_a", "_b", "dateOrder", "labelColor", "labelName", "formatBacker", "hasComment", "BackerContainer", "Avatar", "styles_exports", "user_exports", "BackerInfo", "CopyWrapper", "Copy", "RoleTag", "DonationBasedContent", "RewardBasedContent", "CommentWrapper", "DateInfo", "formatDistanceToNow", "supporterLatestOrder", "Link", "project_exports", "getCheckoutURL", "accounting_exports", "dispatch", "useDispatch", "tracking", "useTracking", "postCampaignLink", "isLegacy", "isHidden", "hasTip", "firstReward", "rewardContent", "LocaleMoneyDisplayer", "toggleModalPostCampaign", "toggleModalReward", "reward_exports", "src_default", "__template", "_c", "_d", "css", "_e", "_f", "BackerCommentWrapper", "_g", "_h", "breakpoints_exports", "init_define_process_env", "init_sentry_release_injection_stub", "React", "Follower", "follower", "label", "user_exports", "FollowerContainer", "Avatar", "styles_exports", "FollowerInfos", "RoleTag", "_a", "src_default", "__template", "colors_exports", "_b", "_c", "init_define_process_env", "init_sentry_release_injection_stub", "React", "_a", "Price", "src_default", "RoleTag", "__template", "_b", "BackerInfo", "styles_exports", "breakpoints_exports", "_c", "Copy", "EngineTag", "type", "children", "tagsTypes", "Sponsor", "sponsorship", "project", "sponsorRef", "usePartnershipTracker", "BackerContainer", "Avatar", "MoneyDisplayer", "BackersTab", "dispatch", "useDispatch", "fandom", "project", "useSelector", "state", "ordersCount", "supportersCount", "sponsorships", "fansCount", "isEditMode", "DisplayMode", "isLoadingFans", "markLoadingStartFans", "useListLoadingIndicator", "loadMoreFans", "loadProjectFans", "extraFields", "Wrapper", "Main", "Content", "styles_exports", "sponsorship", "i", "Sponsor", "ProjectOrderList", "Sidebar", "project_exports", "SidebarRewardsCTA", "SidebarNewsCTA", "FollowerContainer", "Columns", "follower", "Follower", "ShowMoreContainer", "Button", "_a", "useProjectOrder", "order_exports", "orderPageList", "data", "page", "order", "Backer", "__spreadProps", "__spreadValues", "src_default", "__template", "breakpoints_exports", "_b", "_c", "_d", "CommentsTab", "FAQTab", "NewsTab", "ProjectTab", "RewardsTab", "NewsPermalink", "TabRouter", "useHashRouting", "navigation", "useNavigation", "SpinnerContainer", "Spinner", "Routes", "Route", "PATHS", "HashRouter", "NewPermalinkView", "BackersTab", "Navigate", "_a", "src_default", "__template", "location", "useLocation", "project", "useSelector", "state", "project_exports", "slug", "useParams", "fragments", "id", "NEWS", "init_define_process_env", "init_sentry_release_injection_stub", "React", "init_define_process_env", "init_sentry_release_injection_stub", "React", "VIDEO_ID", "Welcome", "project", "_a", "video", "i18n_exports", "VIDEOS", "videoHtml", "videoPlaceholder", "playerRef", "setStepValue", "useStep", "Wrapper", "Title", "glyphs_exports", "styles_exports", "VideoClickWrapper", "handleVidoClick", "VideoLoader", "media_exports", "Button", "handleDone", "onPlayerStateChange", "state", "src_default", "__template", "_b", "_c", "breakpoints_exports", "init_define_process_env", "init_sentry_release_injection_stub", "React", "init_define_process_env", "init_sentry_release_injection_stub", "React", "ProgressComponent", "progress", "step", "className", "name", "ProgressBar", "styles_exports", "Step", "Name", "_a", "Progress", "src_default", "__template", "_b", "colors_exports", "_c", "_d", "init_define_process_env", "init_sentry_release_injection_stub", "React", "CoachingComponent", "project", "children", "className", "_a", "manager", "styles_exports", "user_exports", "Coaching", "src_default", "__template", "colors_exports", "breakpoints_exports", "init_define_process_env", "init_sentry_release_injection_stub", "_a", "Actions", "src_default", "__template", "colors_exports", "LinkAsButton", "breakpoints_exports", "init_define_process_env", "init_sentry_release_injection_stub", "React", "TipComponent", "children", "className", "glyphs_exports", "styles_exports", "_a", "Tip", "src_default", "__template", "colors_exports", "breakpoints_exports", "init_define_process_env", "init_sentry_release_injection_stub", "_a", "SolidContent", "src_default", "__template", "colors_exports", "breakpoints_exports", "_b", "Form", "multiplier", "RadioGroupField", "RadioField", "Field", "Profile", "project", "setStepValue", "useStep", "auth", "user_exports", "user", "avatar", "setAvatar", "onImageChange", "image_uploader_exports", "file", "url", "Progress", "getStepProgress", "getStepIndex", "Coaching", "Formik", "create$3", "create$6", "username", "image", "api", "formikBag", "Form", "SolidContent", "Field", "field", "form", "AvatarField", "event", "meta", "TextField", "__spreadProps", "__spreadValues", "Tip", "Actions", "LinkAsButton", "Button", "_a", "src_default", "__template", "init_define_process_env", "init_sentry_release_injection_stub", "React", "Category", "project", "response", "category_exports", "setStepValue", "useStep", "projectIsDonationBased", "project_exports", "categories", "category", "a", "b", "nameA", "i18n_exports", "nameB", "fundraisers", "other", "Progress", "getStepProgress", "getStepIndex", "Coaching", "Formik", "values", "formikBag", "Form", "SolidContent", "Field", "field", "form", "List", "ClickableTag", "Tip", "Actions", "LinkAsButton", "Button", "_a", "src_default", "__template", "breakpoints_exports", "_b", "init_define_process_env", "init_sentry_release_injection_stub", "React", "CommunityOnboarding", "project", "setStepValue", "useStep", "Progress", "getStepProgress", "getStepIndex", "Coaching", "Formik", "values", "formikBag", "Form", "SolidContent", "Field", "field", "RadioGroupField", "RadioField", "Tag", "Tip", "Actions", "Button", "_a", "src_default", "__template", "_b", "init_define_process_env", "init_sentry_release_injection_stub", "React", "ProjectType", "project", "setStepValue", "useStep", "Progress", "getStepProgress", "getStepIndex", "Coaching", "Formik", "values", "formikBag", "StyledForm", "SolidContent", "Field", "field", "RadioGroupField", "RadioField", "illustrations_exports", "Tip", "Actions", "LinkAsButton", "Button", "_a", "src_default", "Form", "__template", "init_define_process_env", "init_sentry_release_injection_stub", "React", "RewardType", "project", "setStepValue", "useStep", "Progress", "getStepProgress", "getStepIndex", "Coaching", "Formik", "values", "formikBag", "StyledForm", "SolidContent", "Field", "field", "RadioGroupField", "RadioField", "illustrations_exports", "Tip", "Actions", "LinkAsButton", "Button", "_a", "src_default", "Form", "__template", "breakpoints_exports", "init_define_process_env", "init_sentry_release_injection_stub", "React", "Training", "project", "setStepValue", "useStep", "Progress", "getStepProgress", "getStepIndex", "Coaching", "Formik", "values", "trainingType", "key", "value", "formikBag", "Form", "StyledSolidContent", "Field", "field", "CheckboxField", "__spreadProps", "__spreadValues", "Cpf", "styles_exports", "IMAGES", "Tip", "tf", "Actions", "LinkAsButton", "Button", "_a", "src_default", "SolidContent", "__template", "breakpoints_exports", "_b", "colors_exports", "_c", "init_define_process_env", "init_sentry_release_injection_stub", "React", "Slug", "project", "setStepValue", "useStep", "Progress", "getStepProgress", "getStepIndex", "Coaching", "Formik", "values", "slug", "formikBag", "Form", "SolidContent", "Field", "field", "TextField", "__spreadValues", "Tip", "Actions", "LinkAsButton", "Button", "_a", "src_default", "__template", "init_define_process_env", "init_sentry_release_injection_stub", "React", "Layout", "project", "children", "withProgress", "step", "useStep", "OnboardingModal", "_a", "src_default", "Modal", "__template", "styles_exports", "breakpoints_exports", "Progress", "Onboarding", "project", "step", "isDone", "useStep", "Layout", "Welcome", "ProjectType", "CommunityOnboarding", "Category", "RewardType", "Training", "Slug", "Profile", "_a", "_b", "StickyContextBase", "stickyContext", "Menu", "status", "css", "__template", "_c", "StickyHeaderContext", "HeaderLayout", "SCROLL_TO_ATOM", "atom", "DetailLayout", "dispatch", "useDispatch", "project", "useSelector", "state", "userConfig", "useUserEnv", "role", "project_exports", "CURRENT_USER", "showOnboarding", "displayMode", "useDisplayMode", "isEditMode", "contextRef", "stickyStatus", "useStickyFromContext", "isSticky", "headerContextRef", "headerStickyStatus", "isHeaderSticky", "setScrollTo", "useSetAtom", "setIsProjectDetailLaunchShareModalOpen", "useSetModal", "navigation", "useNavigation", "location", "useLocation", "href", "search", "urlParams", "hasConfetti", "messenger", "useMessage", "breakpoint", "EDIT_MODE_TABLET_BREAKPOINT", "breakpoints_exports", "isTablet", "useDramaticallyInefficientMediaQuery", "firstLocationChangeRef", "locationState", "PATHS", "scroll_exports", "getOffsetTop", "toast", "rewardId", "setRewardId", "toggleModalReward", "newUrl", "renderConfetti", "sendBrandsOnPage", "usePartnershipTracker", "DisplayMode", "CancelledWrapper", "BackersBlock", "TabletNavMenuContainer", "ConfiguredNavMenu", "LayoutWrapper", "AppWrapper", "PublicLayout", "SuggestedProjectsList", "Footer", "getNavSectionList", "StyledToastDisplayer", "getCookie", "modals_exports", "HeroHeader", "StickyContext", "TabRouter", "Onboarding", "_d", "src_default", "ToastDisplayer", "zindex_exports", "sizes_exports", "_e", "PM_MENU_WIDTH", "_f", "_g", "colors_exports", "_h", "_i", "_j", "_k", "_l", "element", "init_define_process_env", "init_sentry_release_injection_stub", "loadProjectChannels", "projectId", "pagination", "forceClean", "search", "_", "state", "api", "success", "__spreadProps", "__spreadValues"] }