Added link in ProjectProfile and fork count to ProjectCard

This commit is contained in:
Frank Johnson
2021-09-27 08:24:15 -04:00
committed by Kurt Hutten
parent dd152709ff
commit 7540c908e7
9 changed files with 59 additions and 26 deletions

View File

@@ -90,16 +90,15 @@ export const forkProject = async ({ input }) => {
title = await generateUniqueString(title, isUniqueCallback) title = await generateUniqueString(title, isUniqueCallback)
const { code, description, cadPackage } = projectData const { code, description, cadPackage } = projectData
const data = foreignKeyReplacement({
return db.project.create({
data: foreignKeyReplacement({
...input, ...input,
title, title,
code, code,
description, description,
cadPackage, cadPackage,
}) }),
console.log('forking data', data)
return db.project.create({
data
}) })
} }
@@ -268,7 +267,8 @@ export const deleteProject = async ({ id }: Prisma.ProjectWhereUniqueInput) => {
export const Project = { export const Project = {
forkedFrom: (_obj, { root }) => forkedFrom: (_obj, { root }) =>
root.forkedFromId && db.project.findUnique({where: { id: root.forkedFromId}}), root.forkedFromId &&
db.project.findUnique({ where: { id: root.forkedFromId } }),
childForks: (_obj, { root }) => childForks: (_obj, { root }) =>
db.project.findMany({ where: { forkedFromId: root.id } }), db.project.findMany({ where: { forkedFromId: root.id } }),
user: (_obj, { root }: ResolverArgs<ReturnType<typeof project>>) => user: (_obj, { root }: ResolverArgs<ReturnType<typeof project>>) =>

View File

@@ -1,4 +1,5 @@
import { useAuth } from '@redwoodjs/auth' import { useAuth } from '@redwoodjs/auth'
import { useLocation } from '@redwoodjs/router'
import { Popover } from '@headlessui/react' import { Popover } from '@headlessui/react'
import { Link, navigate, routes } from '@redwoodjs/router' import { Link, navigate, routes } from '@redwoodjs/router'
import { useIdeContext } from 'src/helpers/hooks/useIdeContext' import { useIdeContext } from 'src/helpers/hooks/useIdeContext'
@@ -120,6 +121,7 @@ const IdeHeader = ({
<DefaultTopButtons <DefaultTopButtons
project={project} project={project}
projectTitle={projectTitle} projectTitle={projectTitle}
projectId={projectId}
_projectOwner={_projectOwner} _projectOwner={_projectOwner}
handleRender={handleRender} handleRender={handleRender}
canEdit={canEdit} canEdit={canEdit}
@@ -141,18 +143,22 @@ export default IdeHeader
function DefaultTopButtons({ function DefaultTopButtons({
project, project,
projectTitle, projectTitle,
projectId,
_projectOwner, _projectOwner,
handleRender, handleRender,
canEdit, canEdit,
}) { }) {
const { currentUser } = useAuth() const { currentUser } = useAuth()
const { pathname } = useLocation()
const [createFork] = useMutation(FORK_PROJECT_MUTATION, { const [createFork] = useMutation(FORK_PROJECT_MUTATION, {
onCompleted: ({ forkProject }) => { onCompleted: ({ forkProject }) => {
navigate( const params = {
routes.ide({
userName: forkProject?.user?.userName, userName: forkProject?.user?.userName,
projectTitle: forkProject?.title, projectTitle: forkProject?.title,
}) }
navigate(
pathname.includes('/ide') ? routes.ide(params) : routes.project(params)
) )
}, },
}) })
@@ -161,7 +167,7 @@ function DefaultTopButtons({
variables: { variables: {
input: { input: {
userId: currentUser.sub, userId: currentUser.sub,
forkedFromId: project.id, forkedFromId: project?.id || projectId,
}, },
}, },
}) })

View File

@@ -6,7 +6,14 @@ import { countEmotes } from 'src/helpers/emote'
import ImageUploader from 'src/components/ImageUploader' import ImageUploader from 'src/components/ImageUploader'
import { ImageFallback } from '../ImageUploader/ImageUploader' import { ImageFallback } from '../ImageUploader/ImageUploader'
const ProjectCard = ({ title, mainImage, user, Reaction, cadPackage }) => ( const ProjectCard = ({
title,
mainImage,
user,
Reaction,
cadPackage,
childForks,
}) => (
<li <li
className="rounded p-1.5 bg-ch-gray-760 hover:bg-ch-gray-710 shadow-ch" className="rounded p-1.5 bg-ch-gray-760 hover:bg-ch-gray-710 shadow-ch"
key={`${user?.userName}--${title}`} key={`${user?.userName}--${title}`}
@@ -45,7 +52,8 @@ const ProjectCard = ({ title, mainImage, user, Reaction, cadPackage }) => (
{countEmotes(Reaction).reduce((prev, { count }) => prev + count, 0)} {countEmotes(Reaction).reduce((prev, { count }) => prev + count, 0)}
</div> </div>
<div className="px-2 flex items-center bg-ch-blue-650 bg-opacity-30 text-ch-gray-300 rounded-sm"> <div className="px-2 flex items-center bg-ch-blue-650 bg-opacity-30 text-ch-gray-300 rounded-sm">
<Svg name="fork-new" className="w-4 mr-2" />0 <Svg name="fork-new" className="w-4 mr-2" />
{childForks?.length || 0}
</div> </div>
</div> </div>
</Link> </Link>

View File

@@ -26,9 +26,7 @@ export const QUERY = gql`
mainImage mainImage
createdAt createdAt
updatedAt updatedAt
userId
cadPackage cadPackage
forkedFromId
forkedFrom { forkedFrom {
id id
title title

View File

@@ -38,7 +38,6 @@ const ProjectProfile = ({
const hasPermissionToEdit = const hasPermissionToEdit =
currentUser?.sub === userProject.id || currentUser?.roles.includes('admin') currentUser?.sub === userProject.id || currentUser?.roles.includes('admin')
const project = userProject?.Project const project = userProject?.Project
console.log({ project })
const emotes = countEmotes(project?.Reaction) const emotes = countEmotes(project?.Reaction)
const userEmotes = project?.userReactions.map(({ emote }) => emote) const userEmotes = project?.userReactions.map(({ emote }) => emote)
@@ -73,10 +72,10 @@ const ProjectProfile = ({
<div className="flex"> <div className="flex">
<IdeHeader <IdeHeader
handleRender={() => {}} handleRender={() => {}}
projectTitle={project?.title}
projectOwner={userProject?.userName} projectOwner={userProject?.userName}
projectOwnerImage={userProject?.image} projectOwnerImage={userProject?.image}
projectOwnerId={userProject?.id} projectOwnerId={userProject?.id}
projectTitle={project?.title}
projectId={project?.id} projectId={project?.id}
/> />
</div> </div>
@@ -147,9 +146,20 @@ const ProjectProfile = ({
<KeyValue keyName="Updated on"> <KeyValue keyName="Updated on">
{new Date(project?.updatedAt).toDateString()} {new Date(project?.updatedAt).toDateString()}
</KeyValue> </KeyValue>
{ project.forkedFrom && <KeyValue keyName="Forked from"> {project.forkedFrom && (
{ project.forkedFrom.title } by { project.forkedFrom.user.userName } <KeyValue keyName="Forked from">
</KeyValue> } <Link
className="pink-link"
to={routes.project({
userName: project.forkedFrom.user.userName,
projectTitle: project.forkedFrom.title,
})}
>
{project.forkedFrom.title}
</Link>{' '}
by {project.forkedFrom.user.userName}
</KeyValue>
)}
</div> </div>
<KeyValue keyName="Reactions"> <KeyValue keyName="Reactions">
<EmojiReaction <EmojiReaction

View File

@@ -40,7 +40,10 @@ const ProjectsList = ({
style={{ gridTemplateColumns: 'repeat(auto-fit, minmax(16rem, 1fr))' }} style={{ gridTemplateColumns: 'repeat(auto-fit, minmax(16rem, 1fr))' }}
> >
{filteredProjects.map( {filteredProjects.map(
({ title, mainImage, user, Reaction, cadPackage }, index) => ( (
{ title, mainImage, user, Reaction, cadPackage, childForks },
index
) => (
<ProjectCard <ProjectCard
key={index} key={index}
title={title} title={title}
@@ -48,6 +51,7 @@ const ProjectsList = ({
user={user} user={user}
Reaction={Reaction} Reaction={Reaction}
cadPackage={cadPackage} cadPackage={cadPackage}
childForks={childForks}
/> />
) )
)} )}

View File

@@ -9,6 +9,9 @@ export const QUERY = gql`
title title
cadPackage cadPackage
mainImage mainImage
childForks {
id
}
createdAt createdAt
updatedAt updatedAt
user { user {

View File

@@ -9,6 +9,9 @@ export const QUERY = gql`
title title
mainImage mainImage
cadPackage cadPackage
childForks {
id
}
createdAt createdAt
updatedAt updatedAt
user { user {

View File

@@ -52,6 +52,7 @@
.markdown-overrides div { .markdown-overrides div {
@apply text-ch-gray-300 bg-transparent; @apply text-ch-gray-300 bg-transparent;
} }
.pink-link,
.markdown-overrides a, .markdown-overrides a,
.markdown-overrides div a { .markdown-overrides div a {
@apply text-ch-pink-500 underline bg-transparent; @apply text-ch-pink-500 underline bg-transparent;