[x] Create the POST /blog/$blogId/attachment/s3-post-url route to get an S3 url for attachment uploads.
[x] Create a client-side function that requests the presigned-post-url and then uploads the attachment
Look a little closer into how this will save the attachment record in the DB. Currently the process is to update the blogPost with the mdx string and attachment array. Might be best to just create the attachment record itself and not auto-save the mdx.
[x] Create a DELETE /blog/$blogId/attachment/$attachmentId endpoint
[x] Create a POST /blog/$blogId/attachment endpoint
Do some evaluation and only add the attachment (don't need to save the whole blog content) when only uploading an attachment. See above as also might not want to auto-save the mdx content when dropping an attachment.
[x] Create a POST /blog/preview that will return the mdx-bundler code response for previewing mdx content
[x] Update the PATCH /blog/$blogId endpoint to not required mdx or attachments. There are cases where we only want to update if the blog post is published, the view count, etc. This will require rewriting the updateBlogPost model function.
Part 2 - Finish client-side refactor
[x] When visiting the mdx-preview panel the old content is displayed until the new content has been fetched. This creates a flash when the new content appears, instead of displaying the old content use the loading indicator similar to how a first render of the preview panel would look.
Pay attention to the refresh after the preview returns successfully. After a form finishes submitting, Remix will request the data again for the page. Should wait until this finishes and after the reload display the preview.
[x] Disable the save button when the content has not changed, add loading indicator when content is uploading.
[x] Add toast when the content has successfully uploaded/attachment deleted/attachment failed to upload/etc.
[x] Add an "Are you sure?" when leaving the page and there is unsaved content.
[x] Add an indicator for unused attachments.
[x] Add an indicator for non-uploaded attachments, think about changing the Cloud icon to an info button. This info button would bring up a modal that holds the information for the attachment and allows for retry on the upload. This would also tell users the status of the item, if it is unused, and basic file details, and an open-external link.
Option 1: Remove the cloud icon and go to this system.
Option 2: Remove the open-external button and provide an info button (preferred).
[x] Add optimistic UI for deleting attachments.
[x] Add skeleton loading indicator for the attachments before they load
Part 1 - Finish server-side refactor
POST /blog/$blogId/attachment/s3-post-url
route to get an S3 url for attachment uploads.mdx
string andattachment
array. Might be best to just create the attachment record itself and not auto-save the mdx.DELETE /blog/$blogId/attachment/$attachmentId
endpointPOST /blog/$blogId/attachment
endpointPOST /blog/preview
that will return the mdx-bundler code response for previewing mdx contentPATCH /blog/$blogId
endpoint to not requiredmdx
orattachments
. There are cases where we only want to update if the blog post is published, the view count, etc. This will require rewriting theupdateBlogPost
model function.Part 2 - Finish client-side refactor