diff --git a/web/src/components/EditUserCell/EditUserCell.js b/web/src/components/EditUserCell/EditUserCell.js index e678b4d..4fdf029 100644 --- a/web/src/components/EditUserCell/EditUserCell.js +++ b/web/src/components/EditUserCell/EditUserCell.js @@ -26,9 +26,9 @@ const UPDATE_USER_MUTATION = gql` } ` -export const Loading = () =>
Loading...
+export const Loading = () =>
Loading...
-export const Empty = () =>
Empty
+export const Empty = () =>
Empty
export const Failure = ({ error }) =>
Error: {error.message}
diff --git a/web/src/components/IdePartCell/IdePartCell.js b/web/src/components/IdePartCell/IdePartCell.js index bc91be8..581a032 100644 --- a/web/src/components/IdePartCell/IdePartCell.js +++ b/web/src/components/IdePartCell/IdePartCell.js @@ -1,6 +1,8 @@ import { useMutation, useFlash } from '@redwoodjs/web' import { navigate, routes } from '@redwoodjs/router' import IdeCascadeStudio from 'src/components/IdeCascadeStudio' +import { QUERY as UsersPartsQuery } from 'src/components/PartsOfUserCell' +import useUser from 'src/helpers/hooks/useUser' export const QUERY = gql` query FIND_PART_BY_USENAME_TITLE($partTitle: String!, $userName: String!) { @@ -45,12 +47,19 @@ export const Empty = () =>
Part not found
export const Success = ({ part, refetch }) => { const { addMessage } = useFlash() + const { user } = useUser() const [updatePart, { loading, error }] = useMutation(UPDATE_PART_MUTATION, { onCompleted: () => { addMessage('Part updated.', { classes: 'rw-flash-success' }) }, }) const [forkPart] = useMutation(FORK_PART_MUTATION, { + refetchQueries: [ + { + query: UsersPartsQuery, + variables: { userName: user?.userName }, + }, + ], onCompleted: ({ forkPart }) => { navigate( routes.ide({ diff --git a/web/src/components/IdeToolbar/IdeToolbar.js b/web/src/components/IdeToolbar/IdeToolbar.js index c9fd12c..01160f0 100644 --- a/web/src/components/IdeToolbar/IdeToolbar.js +++ b/web/src/components/IdeToolbar/IdeToolbar.js @@ -11,6 +11,8 @@ import ImageUploader from 'src/components/ImageUploader' import Svg from '../Svg/Svg' import LoginModal from 'src/components/LoginModal' import { FORK_PART_MUTATION } from 'src/components/IdePartCell' +import { QUERY as UsersPartsQuery } from 'src/components/PartsOfUserCell' +import useUser from 'src/helpers/hooks/useUser' const IdeToolbar = ({ canEdit, @@ -26,20 +28,17 @@ const IdeToolbar = ({ const [isLoginModalOpen, setIsLoginModalOpen] = useState(false) const { isAuthenticated, currentUser } = useAuth() const showForkButton = !(canEdit || isDraft) + const [title, setTitle] = useState('untitled-part') + const { user } = useUser() const { addMessage } = useFlash() const [forkPart] = useMutation(FORK_PART_MUTATION, { - onCompleted: ({ forkPart }) => { - navigate( - routes.ide({ - userName: forkPart?.user?.userName, - partTitle: forkPart?.title, - }) - ) - addMessage(`Part created with title: ${forkPart?.title}.`, { - classes: 'rw-flash-success', - }) - }, + refetchQueries: [ + { + query: UsersPartsQuery, + variables: { userName: userNamePart?.userName || user?.userName }, + }, + ], }) const handleClick = ({ event, whichPopup }) => { @@ -52,21 +51,42 @@ const IdeToolbar = ({ setWhichPopup(null) } - const handleSave = () => { - if (isDraft && isAuthenticated) - forkPart({ - variables: { - input: { - userId: currentUser.sub, - title: 'draft', - code, - }, + const saveFork = () => + forkPart({ + variables: { + input: { + userId: currentUser.sub, + title, + code, }, + }, + }) + + const handleSave = async () => { + if (isDraft && isAuthenticated) { + const { data } = await saveFork() + navigate( + routes.ide({ + userName: data?.forkPart?.user?.userName, + partTitle: data?.forkPart?.title, + }) + ) + addMessage(`Part created with title: ${data?.forkPart?.title}.`, { + classes: 'rw-flash-success', }) - else if (isAuthenticated) onSave() + } else if (isAuthenticated) onSave() else recordedLogin() } + const handleSaveAndEdit = async () => { + const { data } = await saveFork() + const { + user: { userName }, + title: partTitle, + } = data?.forkPart || { user: {} } + navigate(routes.part({ userName, partTitle })) + } + const recordedLogin = async () => { ReactGA.event({ category: 'login', @@ -135,6 +155,27 @@ const IdeToolbar = ({ )} + {isDraft && isAuthenticated && ( +
+ +
title:
+ + setTitle(target?.value.replace(/([^a-zA-Z\d_:])/g, '-')) + } + /> +
+
+ )}
+ +
+ + Start Hacking Now + +
+
diff --git a/web/src/components/PartCell/PartCell.js b/web/src/components/PartCell/PartCell.js index b86c934..0bef362 100644 --- a/web/src/components/PartCell/PartCell.js +++ b/web/src/components/PartCell/PartCell.js @@ -97,9 +97,9 @@ const DELETE_PART_MUTATION = gql` } ` -export const Loading = () =>
Loading...
+export const Loading = () =>
Loading...
-export const Empty = () =>
Empty
+export const Empty = () =>
Empty
export const Failure = ({ error }) =>
Error: {error.message}
diff --git a/web/src/components/PartProfile/PartProfile.js b/web/src/components/PartProfile/PartProfile.js index 4d879b6..8a91baa 100644 --- a/web/src/components/PartProfile/PartProfile.js +++ b/web/src/components/PartProfile/PartProfile.js @@ -130,6 +130,23 @@ const PartProfile = ({ > {isEditable ? 'Save Details' : 'Edit Details'} + {isEditable && ( + + )}