-
+
{' '}
-
{mainAccount.name}
+
{mainAccount?.name}
- {account.host && account.host.slug !== mainAccount.slug && (
+ {account?.host && account.host.slug !== mainAccount?.slug && (
-
{mainAccount.name} is fiscally hosted by
+
{mainAccount?.name} is fiscally hosted by
-
{' '}
-
{account.host.name}
+
{' '}
+
{account?.host.name}
)}
diff --git a/components/crowdfunding-redesign/Fundraiser.tsx b/components/crowdfunding-redesign/Fundraiser.tsx
deleted file mode 100644
index 3556142bce7..00000000000
--- a/components/crowdfunding-redesign/Fundraiser.tsx
+++ /dev/null
@@ -1,377 +0,0 @@
-import React from 'react';
-import { getApplicableTaxes } from '@opencollective/taxes';
-import { cva } from 'class-variance-authority';
-import { Markup } from 'interweave';
-import { merge, pick } from 'lodash';
-import { ArrowLeft, ArrowRight } from 'lucide-react';
-// eslint-disable-next-line no-restricted-imports
-import Link from 'next/link';
-import { useRouter } from 'next/router';
-import { FormattedMessage } from 'react-intl';
-import LiteYouTubeEmbed from 'react-lite-youtube-embed';
-
-import { getPrecisionFromAmount, graphqlAmountValueInCents } from '../../lib/currency-utils';
-import { isPastEvent } from '../../lib/events';
-import { TierFrequency } from '../../lib/graphql/types/v2/graphql';
-import useLoggedInUser from '../../lib/hooks/useLoggedInUser';
-import { isTierExpired } from '../../lib/tier-utils';
-
-import Avatar, { StackedAvatars } from '../Avatar';
-import FormattedMoneyAmount from '../FormattedMoneyAmount';
-import { useModal } from '../ModalContext';
-import { Button } from '../ui/Button';
-import { Progress } from '../ui/Progress';
-
-import { SingleUpdate } from './updates/SingleUpdate';
-import { UpdatesList } from './updates/UpdatesList';
-import { ContributionsList } from './ContributionsList';
-import ExpensesList from './ExpensesList';
-import {
- aggregateGoalAmounts,
- getDefaultFundraiserValues,
- getYouTubeIDFromUrl,
- triggerPrototypeToast,
-} from './helpers';
-import { ProfileModal } from './ProfileModal';
-import { Tabs, TabsContent, TabsList, TabsTrigger } from './Tabs';
-import { ThemeColor } from './ThemeColor';
-
-const canContribute = (collective, LoggedInUser) => {
- if (!collective.isActive) {
- return false;
- } else if (collective.type === 'EVENT') {
- return !isPastEvent(collective) || Boolean(LoggedInUser.isAdminOfCollectiveOrHost(collective));
- } else {
- return true;
- }
-};
-
-const Tiers = ({ account }) => {
- const LoggedInUser = useLoggedInUser();
-
- return (
-
- {account.tiers.nodes.map(tier => {
- const isFlexibleAmount = tier.amountType === 'FLEXIBLE';
- const minAmount = isFlexibleAmount ? tier.minimumAmount : tier.amount;
- const tierIsExpired = isTierExpired(tier);
- const canContributeToCollective = canContribute(account, LoggedInUser);
- const hasNoneLeft = tier.availableQuantity === 0;
- const currency = tier.currency || account.currency;
- const isDisabled = !canContributeToCollective || tierIsExpired || hasNoneLeft;
- const taxes = getApplicableTaxes(account, account.host, tier.type);
-
- return (
-
-
{tier.name}
-
{tier.description}
- {!isDisabled && graphqlAmountValueInCents(minAmount) > 0 && (
-
- {isFlexibleAmount && (
-
-
-
- )}
-
-
-
-
- {taxes.length > 0 && ' *'}
-
- {taxes.length > 0 && (
-
- *{' '}
- {taxes.length > 1 ? (
-
- ) : (
-
- )}
-
- )}
-
-
- )}
-
-
- );
- })}
-
- );
-};
-
-// Naive implementation of Goals for prototype
-const Goals = ({ account }) => {
- const {
- stats,
- financialContributors,
- currency,
- settings: { goals },
- } = account;
- const hasYearlyGoal = goals?.find(g => g.type === 'yearlyBudget');
- const hasMonthlyGoal = goals?.find(g => g.type === 'monthlyBudget');
- const currentAmount = hasYearlyGoal
- ? stats.yearlyBudget.valueInCents
- : hasMonthlyGoal
- ? stats.yearlyBudget.valueInCents / 12
- : stats.totalAmountReceived.valueInCents;
-
- let goalTarget;
- if (hasYearlyGoal || hasMonthlyGoal) {
- goalTarget = aggregateGoalAmounts(goals);
- }
- const percentage = Math.round(goalTarget ? (currentAmount / goalTarget.amount) * 100 : 0);
- return (
-
- {goalTarget &&
}
-
-
-
- {goalTarget ? (
-
{percentage}%
- ) : (
-
- )}
-
-
- {goalTarget && (
-
- towards{' '}
- {' '}
- {hasYearlyGoal ? per year : hasMonthlyGoal && per month} goal
-
- )}
-
-
-
{stats.contributorsCount}
contributors
-
-
-
-
-
- );
-};
-
-const ContentOverview = ({ content }) => {
- const parser = new DOMParser();
- const doc = parser.parseFromString(content, 'text/html');
- const headings = doc.querySelectorAll('h3');
- const headingTexts = Array.from(headings).map(h3 => h3.textContent?.trim() || '');
- const linkClasses = cva('px-2 font-semibold block hover:text-primary text-sm border-l-[3px]', {
- variants: {
- active: {
- true: 'border-primary/70',
- false: 'border-transparent',
- },
- },
- defaultVariants: {
- active: false,
- },
- });
-
- return (
-
-
- About
-
- {headingTexts.map(heading => (
-
- {heading}
-
- ))}
-
- );
-};
-
-export default function Fundraiser({ account }) {
- const fundraiser = getDefaultFundraiserValues(account);
- const mainAccount = account.parent || account;
- const router = useRouter();
- const tabRef = React.useRef();
- const { showModal } = useModal();
-
- return (
-
-
-
-
-
-
{fundraiser.name}
-
{fundraiser.description}
-
-
-
- {/* main */}
-
-
- {fundraiser.cover?.type === 'IMAGE' ? (
-
![]({fundraiser.cover.url})
- ) : fundraiser.cover?.type === 'VIDEO' ? (
-
-
-
- ) : null}
-
-
-
- {account.type === 'EVENT' ? 'Event' : 'Fundraiser'} by{' '}
- {
- e.preventDefault();
- showModal(ProfileModal, { account: mainAccount });
- }}
- >
- {mainAccount.name}
-
-
-
-
- {/* sidebar */}
-
-
-
-
-
-
-
-
-
- router.push(`/preview/${account.slug}/support${slug !== 'fundraiser' ? `/${slug}` : ''}`, undefined, {
- shallow: true,
- })
- }
- >
-
-
-
- Fundraiser
-
- Updates
-
-
- Contributions
-
-
- Expenses
-
-
-
-
-
-
-
-
-
-
-
-
-
- {
- // Allow some iframes
- const attrs = [].slice.call(node.attributes);
- if (node.tagName === 'iframe') {
- const src = node.getAttribute('src');
- const parsedUrl = new URL(src);
- const hostname = parsedUrl.hostname;
- if (['youtube-nocookie.com', 'www.youtube-nocookie.com', 'anchor.fm'].includes(hostname)) {
- const attributes = merge({}, ...attrs.map(({ name, value }) => ({ [name]: value })));
- return (
-
- );
- }
- } else if (node.tagName === 'a') {
- // Open links in new tab
- node.setAttribute('target', '_blank');
- node.setAttribute('rel', 'noopener noreferrer');
- }
- }}
- />
-
-
{account.tiers && }
-
-
-
-
- {router.query.path?.[1] ? (
-
- ) : (
-
- )}
-
-
-
-
-
-
-
-
-
-
-
- );
-}
diff --git a/components/crowdfunding-redesign/FundraiserLayout.tsx b/components/crowdfunding-redesign/FundraiserLayout.tsx
new file mode 100644
index 00000000000..33fe3272ba5
--- /dev/null
+++ b/components/crowdfunding-redesign/FundraiserLayout.tsx
@@ -0,0 +1,171 @@
+import React from 'react';
+import { useQuery } from '@apollo/client';
+import { useRouter } from 'next/router';
+
+import { API_V2_CONTEXT } from '../../lib/graphql/helpers';
+import LiteYouTubeEmbed from 'react-lite-youtube-embed';
+import MessageBoxGraphqlError from '../MessageBoxGraphqlError';
+import Page from '../Page';
+
+import { Banner } from './Banner';
+import { Footer } from './Footer';
+import Fundraiser from './Fundraiser';
+import { profilePageQuery } from './queries';
+import {
+ aggregateGoalAmounts,
+ getDefaultFundraiserValues,
+ getYouTubeIDFromUrl,
+ triggerPrototypeToast,
+} from './helpers';
+import { useModal } from '../ModalContext';
+import Link from '../Link';
+import { ProfileModal } from './ProfileModal';
+import { ArrowRight } from 'lucide-react';
+import { Progress } from '../ui/Progress';
+import FormattedMoneyAmount from '../FormattedMoneyAmount';
+import { StackedAvatars } from '../Avatar';
+import { Button } from '../ui/Button';
+import { FormattedMessage } from 'react-intl';
+import { TabsList, TabsTrigger } from './DumbTabs';
+import { ThemeColor } from './ThemeColor';
+import ProfileLayout from './ProfileLayout';
+import { Goals } from './Goals';
+
+export function FundraiserLayout({ children, activeTab }) {
+ const router = useRouter();
+ const { data, error, loading } = useQuery(profilePageQuery, {
+ variables: { slug: router.query.accountSlug },
+ context: API_V2_CONTEXT,
+ });
+ const account = data?.account;
+ const fundraiser = getDefaultFundraiserValues(account);
+ const tabRef = React.useRef();
+ const { showModal } = useModal();
+
+ if (loading || !account) {
+ return null;
+ }
+ const mainAccount = account.parent || account;
+ const baseRoute = `/preview/${router.query.collectiveSlug}/${account.type === 'EVENT' ? 'events' : 'projects'}/${account.slug}`;
+ if (error) {
+ return (
+
+
+
+ );
+ }
+
+ return (
+
[
+ {
+ href: `/preview/${router.query.collectiveSlug}/${account?.type === 'EVENT' ? 'events' : 'projects'}`,
+ label: account?.type === 'EVENT' ? 'Events' : 'Projects',
+ },
+ { label: account?.name },
+ ]}
+ >
+
+
+ {/*
*/}
+
+ {/* */}
+
+
+
+
{fundraiser.name}
+
{fundraiser.description}
+
+
+
+ {/* main */}
+
+
+ {fundraiser.cover?.type === 'IMAGE' ? (
+
![]({fundraiser.cover.url})
+ ) : fundraiser.cover?.type === 'VIDEO' ? (
+
+
+
+ ) : null}
+
+
+
+ {account.type === 'EVENT' ? 'Event' : 'Fundraiser'} by{' '}
+ {
+ e.preventDefault();
+ showModal(ProfileModal, { account: mainAccount });
+ }}
+ >
+ {mainAccount.name}
+
+
+
+
+ {/* sidebar */}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Fundraiser
+
+
+ Updates
+
+
+ Contributions
+
+
+ Expenses
+
+
+
+
+ {children}
+
+
+
+
+
+
+ );
+}
diff --git a/components/crowdfunding-redesign/FundraisingPage.tsx b/components/crowdfunding-redesign/FundraisingPage.tsx
new file mode 100644
index 00000000000..99d92ac16ef
--- /dev/null
+++ b/components/crowdfunding-redesign/FundraisingPage.tsx
@@ -0,0 +1,88 @@
+import React from 'react';
+import { useQuery } from '@apollo/client';
+import { useRouter } from 'next/router';
+
+import { API_V2_CONTEXT } from '../../lib/graphql/helpers';
+
+import MessageBoxGraphqlError from '../MessageBoxGraphqlError';
+import Page from '../Page';
+
+import { Banner } from './Banner';
+import { Footer } from './Footer';
+import Fundraiser from './Fundraiser';
+import { profilePageQuery } from './queries';
+import { ContentOverview } from './ContentOverview';
+import { FormattedMessage } from 'react-intl';
+import { getDefaultFundraiserValues } from './helpers';
+import { Markup } from 'interweave';
+import { merge, pick } from 'lodash';
+import { Tiers } from './Tiers';
+import { Goals } from './Goals';
+
+export function FundraisingPage() {
+ const router = useRouter();
+ const { data, error, loading } = useQuery(profilePageQuery, {
+ variables: { slug: router.query.accountSlug },
+ context: API_V2_CONTEXT,
+ });
+ const account = data?.account;
+ const fundraiser = getDefaultFundraiserValues(account);
+
+ if (loading || !account) {
+ return null;
+ }
+ if (error) {
+ return (
+
+
+
+ );
+ }
+
+ return (
+
+
+
+
+
+
+
+
+ {
+ // Allow some iframes
+ const attrs = [].slice.call(node.attributes);
+ if (node.tagName === 'iframe') {
+ const src = node.getAttribute('src');
+ const parsedUrl = new URL(src);
+ const hostname = parsedUrl.hostname;
+ if (['youtube-nocookie.com', 'www.youtube-nocookie.com', 'anchor.fm'].includes(hostname)) {
+ const attributes = merge({}, ...attrs.map(({ name, value }) => ({ [name]: value })));
+ return (
+
+ );
+ }
+ } else if (node.tagName === 'a') {
+ // Open links in new tab
+ node.setAttribute('target', '_blank');
+ node.setAttribute('rel', 'noopener noreferrer');
+ }
+ }}
+ />
+
+
{account.tiers && }
+
+
+ );
+}
diff --git a/components/crowdfunding-redesign/Goal.tsx b/components/crowdfunding-redesign/Goal.tsx
new file mode 100644
index 00000000000..084307d3d40
--- /dev/null
+++ b/components/crowdfunding-redesign/Goal.tsx
@@ -0,0 +1,77 @@
+import React from 'react';
+
+import { aggregateGoalAmounts } from './helpers';
+
+import { Progress } from '../ui/Progress';
+import FormattedMoneyAmount from '../FormattedMoneyAmount';
+import { StackedAvatars } from '../Avatar';
+
+// Naive implementation of Goals for prototype
+export function Goal({ account }) {
+ if (!account) {
+ return null;
+ }
+ const {
+ stats,
+ financialContributors,
+ currency,
+ settings: { goals },
+ } = account;
+ const hasYearlyGoal = goals?.find(g => g.type === 'yearlyBudget');
+ const hasMonthlyGoal = goals?.find(g => g.type === 'monthlyBudget');
+ const currentAmount = hasYearlyGoal
+ ? stats.yearlyBudget.valueInCents
+ : hasMonthlyGoal
+ ? stats.yearlyBudget.valueInCents / 12
+ : stats.totalAmountReceived.valueInCents;
+
+ let goalTarget;
+ if (hasYearlyGoal || hasMonthlyGoal) {
+ goalTarget = aggregateGoalAmounts(goals);
+ }
+ const percentage = Math.round(goalTarget ? (currentAmount / goalTarget.amount) * 100 : 0);
+ return (
+
+ {goalTarget &&
}
+
+
+
+ {goalTarget ? (
+
{percentage}%
+ ) : (
+
+ )}
+
+
+ {/* {goalTarget && (
+
+ towards{' '}
+ {' '}
+ {hasYearlyGoal ? per year : hasMonthlyGoal && per month} goal
+
+ )} */}
+
+ {/*
+
{stats.contributorsCount}
contributors
+
*/}
+ {/*
+
+
*/}
+
+ );
+}
diff --git a/components/crowdfunding-redesign/Goals.tsx b/components/crowdfunding-redesign/Goals.tsx
new file mode 100644
index 00000000000..88e184087ed
--- /dev/null
+++ b/components/crowdfunding-redesign/Goals.tsx
@@ -0,0 +1,77 @@
+import React from 'react';
+
+import { aggregateGoalAmounts } from './helpers';
+
+import { Progress } from '../ui/Progress';
+import FormattedMoneyAmount from '../FormattedMoneyAmount';
+import { StackedAvatars } from '../Avatar';
+
+// Naive implementation of Goals for prototype
+export function Goals({ account }) {
+ if (!account) {
+ return null;
+ }
+ const {
+ stats,
+ financialContributors,
+ currency,
+ settings: { goals },
+ } = account;
+ const hasYearlyGoal = goals?.find(g => g.type === 'yearlyBudget');
+ const hasMonthlyGoal = goals?.find(g => g.type === 'monthlyBudget');
+ const currentAmount = hasYearlyGoal
+ ? stats.yearlyBudget.valueInCents
+ : hasMonthlyGoal
+ ? stats.yearlyBudget.valueInCents / 12
+ : stats.totalAmountReceived.valueInCents;
+
+ let goalTarget;
+ if (hasYearlyGoal || hasMonthlyGoal) {
+ goalTarget = aggregateGoalAmounts(goals);
+ }
+ const percentage = Math.round(goalTarget ? (currentAmount / goalTarget.amount) * 100 : 0);
+ return (
+
+ {goalTarget &&
}
+
+
+
+ {goalTarget ? (
+
{percentage}%
+ ) : (
+
+ )}
+
+
+ {goalTarget && (
+
+ towards{' '}
+ {' '}
+ {hasYearlyGoal ? per year : hasMonthlyGoal && per month} goal
+
+ )}
+
+
+
{stats.contributorsCount}
contributors
+
+
+
+
+
+ );
+}
diff --git a/components/crowdfunding-redesign/Header.tsx b/components/crowdfunding-redesign/Header.tsx
new file mode 100644
index 00000000000..eca85f40f5a
--- /dev/null
+++ b/components/crowdfunding-redesign/Header.tsx
@@ -0,0 +1,171 @@
+import { motion, useMotionTemplate, useMotionValue, useMotionValueEvent, useScroll, useTransform } from 'framer-motion';
+import React, { useEffect, useState } from 'react';
+import { TabsList, TabsTrigger } from './DumbTabs';
+import clsx from 'clsx';
+import Avatar from '../Avatar';
+import SocialLinks from './SocialLinks';
+import { triggerPrototypeToast } from './helpers';
+import { FormattedMessage } from 'react-intl';
+import { Button } from '../ui/Button';
+import { MoreHorizontal, Share } from 'lucide-react';
+import Link from '../Link';
+import { ProfileActionButtons } from './ProfileActionButtons';
+import { Breadcrumb } from './Breadcrumb';
+
+const clamp = (number, min, max) => Math.min(Math.max(number, min), max);
+
+function useBoundedScroll(bounds) {
+ const { scrollY } = useScroll();
+ const scrollYBounded = useMotionValue(0);
+ const scrollYBoundedProgress = useTransform(scrollYBounded, [0, bounds], [0, 1]);
+
+ useEffect(() => {
+ return scrollY.onChange(current => {
+ const previous = scrollY.getPrevious();
+ const diff = current - previous;
+ const newScrollYBounded = scrollYBounded.get() + diff;
+ scrollYBounded.set(clamp(newScrollYBounded, 0, bounds));
+ });
+ }, [bounds, scrollY, scrollYBounded]);
+ return { scrollYBounded, scrollYBoundedProgress };
+}
+
+export function Header({ collective, account, profile, collapsed = false, activeTab, breadcrumbs }) {
+ // const { scrollYBoundedProgress, scrollYBounded } = useBoundedScroll(600);
+ const hasSocialLinks = collective?.socialLinks && collective.socialLinks.length > 0;
+ // const height = useTransform(scrollY, value => Math.max(50 - value, 80));
+ const { scrollY } = useScroll();
+ const [scrolledHeader, setScrolledHeader] = useState(false);
+ useMotionValueEvent(scrollY, 'change', latest => {
+ if (latest > 400) {
+ setScrolledHeader(true);
+ } else {
+ setScrolledHeader(false);
+ }
+ });
+ // const collapsedHeader = useTransform(scrollY, value => value > 600);
+ // useEffect(() => {
+ // return scrollYBounded.onChange(current => {
+ // console.log(current);
+ // });
+ // });
+ // console.log({ collapsedHeader });
+ return (
+
+
+ {profile?.cover?.url &&
![]({profile?.cover.url})
}
+
+ {!collapsed && (
+
+
+
+
+
{profile?.name}
+
{profile?.description}
+ {hasSocialLinks &&
}
+
+
+
+
+ )}
+
+
+
+
+
+
+
+ {collapsed ? (
+
+
+
+ ) : (
+
+
+
+
+
+
+ Fundraising
+
+
+ Finances
+
+
+ Updates
+
+
+ Expenses
+
+
+ About
+
+
+
+
+
+
+ )}
+
+
+
+
+
+
+
+ );
+}
diff --git a/components/crowdfunding-redesign/Profile.tsx b/components/crowdfunding-redesign/Profile.tsx
index 02ca3702b15..2232b5d7490 100644
--- a/components/crowdfunding-redesign/Profile.tsx
+++ b/components/crowdfunding-redesign/Profile.tsx
@@ -10,6 +10,7 @@ import Link from '../Link';
import { Button } from '../ui/Button';
import { Progress } from '../ui/Progress';
+import { ContentOverview } from './ContentOverview';
import ExpensesList from './ExpensesList';
import {
aggregateGoalAmounts,
@@ -19,82 +20,18 @@ import {
triggerPrototypeToast,
} from './helpers';
import SocialLinks from './SocialLinks';
-import { Tabs, TabsContent, TabsList, TabsTrigger } from './Tabs';
-import { ThemeColor } from './ThemeColor';
-
-function FundraiserCard({ account, isRoot = false }) {
- const fundraiser = getDefaultFundraiserValues(account);
- const {
- stats,
- currency,
- settings: { goals },
- } = account;
- const hasYearlyGoal = goals?.find(g => g.type === 'yearlyBudget');
- const hasMonthlyGoal = goals?.find(g => g.type === 'monthlyBudget');
- const currentAmount = hasYearlyGoal
- ? stats.yearlyBudget.valueInCents
- : hasMonthlyGoal
- ? stats.yearlyBudget.valueInCents / 12
- : stats.totalAmountReceived.valueInCents;
+// import { Tabs, TabsContent, TabsList, TabsTrigger } from './Tabs';
+import { TabsList, TabsTrigger } from './DumbTabs';
- let goalTarget;
- if (hasYearlyGoal || hasMonthlyGoal) {
- goalTarget = aggregateGoalAmounts(goals);
- }
- const percentage = Math.round(goalTarget ? (currentAmount / goalTarget.amount) * 100 : 0);
- return (
-
- {fundraiser.cover?.type === 'IMAGE' && fundraiser.cover.url ? (
-
![]({fundraiser.cover.url})
- ) : fundraiser.cover?.type === 'VIDEO' ? (
-
![]({`https://i.ytimg.com/vi/${getYouTubeIDFromUrl(fundraiser.cover.videoUrl)}/maxresdefault.jpg`})
- ) : null}
-
-
{fundraiser.name}
- {fundraiser.description &&
{fundraiser.description}
}
-
-
- {goalTarget &&
}
-
-
-
- {goalTarget ? (
-
{percentage}%
- ) : (
-
-
-
- {' raised'}
-
-
- )}
-
-
-
-
-
-
-
- );
-}
+import { ThemeColor } from './ThemeColor';
+import { Tiers } from './Tiers';
+import { ProfileAccounts } from './Accounts';
export default function Profile({ account }) {
const hasSocialLinks = account.socialLinks && account.socialLinks.length > 0;
const profile = getDefaultProfileValues(account);
const tabRef = React.useRef();
+ console.log({ description: account.longDescription });
return (
@@ -136,12 +73,28 @@ export default function Profile({ account }) {
-
+
+
+
+
+ Home
+
+ Finances
+ Updates
+
+ Expenses
+
+ About
+
+
+
+ {/*
Home
-
+ Finances
+ Updates
Expenses
@@ -150,13 +103,58 @@ export default function Profile({ account }) {
+
+
+
+
+
+ {
+ // Allow some iframes
+ const attrs = [].slice.call(node.attributes);
+ if (node.tagName === 'iframe') {
+ const src = node.getAttribute('src');
+ const parsedUrl = new URL(src);
+ const hostname = parsedUrl.hostname;
+ if (['youtube-nocookie.com', 'www.youtube-nocookie.com', 'anchor.fm'].includes(hostname)) {
+ const attributes = merge({}, ...attrs.map(({ name, value }) => ({ [name]: value })));
+ return (
+
+ );
+ }
+ } else if (node.tagName === 'a') {
+ // Open links in new tab
+ node.setAttribute('target', '_blank');
+ node.setAttribute('rel', 'noopener noreferrer');
+ }
+ }}
+ />
+
+
{account.tiers && }
+
+
-
{account.childrenAccounts?.nodes?.map(child => {
return ;
})}
+
+
+
@@ -192,7 +190,7 @@ export default function Profile({ account }) {
/>