'use client'; import React, { FC, useCallback, useContext, useMemo } from 'react'; import { MarketplaceProvider } from '@gitroom/frontend/components/marketplace/marketplace.provider'; import { useUser } from '@gitroom/frontend/components/layout/user.context'; import { Button } from '@gitroom/react/form/button'; import { useFetch } from '@gitroom/helpers/utils/custom.fetch'; import useSWR from 'swr'; import { capitalize } from 'lodash'; import removeMd from 'remove-markdown'; import { deleteDialog } from '@gitroom/react/helpers/delete.dialog'; import { useModals } from '@gitroom/frontend/components/layout/new-modal'; import { Post as PrismaPost } from '@prisma/client'; import dynamic from 'next/dynamic'; import { IntegrationContext } from '@gitroom/frontend/components/launches/helpers/use.integration'; import dayjs from 'dayjs'; import { useT } from '@gitroom/react/translation/get.transation.service.client'; import { newDayjs } from '@gitroom/frontend/components/layout/set.timezone'; const PreviewPopupDynamic = dynamic(() => import('@gitroom/frontend/components/marketplace/preview.popup.dynamic').then( (mod) => mod.PreviewPopupDynamic ) ); interface SpecialMessageInterface { type: string; data: { id: string; [key: string]: any; }; } export const OrderCompleted: FC = () => { const t = useT(); return (
{t('order_completed', 'Order completed')}
{t('the_order_has_been_completed', 'The order has been completed')}
); }; export const Published: FC<{ isCurrentOrder: boolean; isSellerOrBuyer: 'BUYER' | 'SELLER'; orderStatus: string; data: SpecialMessageInterface; }> = (props) => { const t = useT(); const { data, isSellerOrBuyer } = props; return (
{isSellerOrBuyer === 'BUYER' ? 'Your' : 'The'} {t('post_has_been_published', 'post has been published')}
platform {data.data.name}
{data.data.name}
{t('url_1', 'URL:')} {data.data.url}
); }; export const PreviewPopup: FC<{ postId: string; providerId: string; post: { integration: string; group: string; posts: PrismaPost[]; settings: any; }; }> = (props) => { const modal = useModals(); const close = useCallback(() => { return modal.closeAll(); }, []); return (
); }; export const Offer: FC<{ isCurrentOrder: boolean; isSellerOrBuyer: 'BUYER' | 'SELLER'; orderStatus: string; data: SpecialMessageInterface; }> = (props) => { const { data, isSellerOrBuyer, isCurrentOrder, orderStatus } = props; const fetch = useFetch(); const acceptOrder = useCallback(async () => { const { url } = await ( await fetch(`/marketplace/orders/${data.data.id}/payment`, { method: 'POST', }) ).json(); window.location.href = url; }, [data.data.id]); const totalPrice = useMemo(() => { return data?.data?.ordersItems?.reduce((all: any, current: any) => { return all + current.price * current.quantity; }, 0); }, [data?.data?.ordersItems]); const t = useT(); return (
{t('new_offer', 'New Offer')}
${totalPrice}
{t('platform', 'Platform')}
{data.data.ordersItems.map((item: any) => (
platform {item.integration.name}
{item.integration.name}
{item.quantity} {t('posts', 'Posts')}
))} {orderStatus === 'PENDING' && isCurrentOrder && isSellerOrBuyer === 'BUYER' && (
)} {orderStatus === 'ACCEPTED' && (
)}
); }; export const Post: FC<{ isCurrentOrder: boolean; isSellerOrBuyer: 'BUYER' | 'SELLER'; orderStatus: string; message: string; data: SpecialMessageInterface; }> = (props) => { const { data, isSellerOrBuyer, message, isCurrentOrder, orderStatus } = props; const fetch = useFetch(); const modal = useModals(); const getIntegration = useCallback(async () => { return ( await fetch( `/integrations/${data.data.integration}?order=${data.data.id}`, { method: 'GET', } ) ).json(); }, []); const requestRevision = useCallback(async () => { if ( !(await deleteDialog( 'Are you sure you want to request a revision?', 'Yes' )) ) { return; } await fetch(`/marketplace/posts/${data.data.postId}/revision`, { method: 'POST', body: JSON.stringify({ message, }), headers: { 'Content-Type': 'application/json', }, }); }, [data]); const requestApproved = useCallback(async () => { if ( !(await deleteDialog( 'Are you sure you want to approve this post?', 'Yes' )) ) { return; } await fetch(`/marketplace/posts/${data.data.postId}/approve`, { method: 'POST', body: JSON.stringify({ message, }), headers: { 'Content-Type': 'application/json', }, }); }, [data]); const preview = useCallback(async () => { const post = await ( await fetch(`/marketplace/posts/${data.data.postId}`) ).json(); const integration = await getIntegration(); modal.openModal({ classNames: { modal: 'bg-transparent text-textColor', }, size: 'auto', withCloseButton: false, children: ( ), }); }, [data?.data]); const { data: integrationData } = useSWR<{ id: string; name: string; picture: string; providerIdentifier: string; }>(`/integrations/${data.data.integration}`, getIntegration); const t = useT(); return (
{t('post_draft', 'Post Draft')} {capitalize(integrationData?.providerIdentifier || '')}
platform {integrationData?.name}
{integrationData?.name}
{removeMd(data.data.description)}
{isSellerOrBuyer === 'BUYER' && isCurrentOrder && data.data.status === 'PENDING' && orderStatus === 'ACCEPTED' && (
)} {data.data.status === 'REVISION' && (
)} {data.data.status === 'APPROVED' && (
)} {data.data.status === 'CANCELED' && (
)}
); }; export const SpecialMessage: FC<{ data: SpecialMessageInterface; id: string; }> = (props) => { const { data, id } = props; const { message } = useContext(MarketplaceProvider); const user = useUser(); const isCurrentOrder = useMemo(() => { return message?.orders?.[0]?.id === data?.data?.id; }, [message, data]); const isSellerOrBuyer = useMemo(() => { return user?.id === message?.buyerId ? 'BUYER' : 'SELLER'; }, [user, message]); if (data.type === 'offer') { return ( ); } if (data.type === 'post') { return ( ); } if (data.type === 'published') { return ( ); } if (data.type === 'order-completed') { return ; } return null; };