diff --git a/config/dependencies.yaml b/config/dependencies.yaml
index 463e35b3489..656e05c3b13 100644
--- a/config/dependencies.yaml
+++ b/config/dependencies.yaml
@@ -324,6 +324,7 @@ org:
'lodash.orderby': *_orderby
'lodash.set': *_set
'next': *next
+ 'react-dropzone': '14.2.3'
'react-hotkeys-hook': *reactHotkeysHook
'react-instantsearch-dom': *reactInstantsearchDom
'react-markdown': *reactMarkdown
diff --git a/sites/backend/src/index.mjs b/sites/backend/src/index.mjs
index e04f596ef23..59e182ce6d5 100644
--- a/sites/backend/src/index.mjs
+++ b/sites/backend/src/index.mjs
@@ -25,7 +25,7 @@ import { openapi } from '../openapi/index.mjs'
const config = verifyConfig()
const prisma = new PrismaClient()
const app = express()
-app.use(express.json())
+app.use(express.json({ limit: '12mb' })) // Required for img upload
app.use(express.static('public'))
app.use('/docs', swaggerUi.serve, swaggerUi.setup(openapi))
diff --git a/sites/backend/src/middleware.mjs b/sites/backend/src/middleware.mjs
index d6e1274abe3..7ba919b177e 100644
--- a/sites/backend/src/middleware.mjs
+++ b/sites/backend/src/middleware.mjs
@@ -1,4 +1,3 @@
-//import bodyParser from 'body-parser'
import cors from 'cors'
import http from 'passport-http'
import jwt from 'passport-jwt'
@@ -14,8 +13,6 @@ const levelFromRole = (role) => {
}
function loadExpressMiddleware(app) {
- // FIXME: Is this still needed in FreeSewing v3?
- //app.use(bodyParser.urlencoded({ extended: true }))
app.use(cors())
}
diff --git a/sites/org/components/account/img/img.en.yaml b/sites/org/components/account/img/img.en.yaml
index 24b223a8e58..03412572965 100644
--- a/sites/org/components/account/img/img.en.yaml
+++ b/sites/org/components/account/img/img.en.yaml
@@ -1,4 +1,6 @@
title: How about a picture too?
-bioPreview: Bio Preview
+dragAndDropImageHere: Drag and drop an image here
+selectImage: Select an image
+or: or
save: Save
continue: Continue
diff --git a/sites/org/components/account/img/index.js b/sites/org/components/account/img/index.js
index eaeb2afd830..fcf73ffa51e 100644
--- a/sites/org/components/account/img/index.js
+++ b/sites/org/components/account/img/index.js
@@ -1,8 +1,9 @@
-import { useState } from 'react'
+import { useState, useCallback } from 'react'
import { useTranslation } from 'next-i18next'
import useBackend from 'site/hooks/useBackend.js'
import Link from 'next/link'
import { Choice, Icons, welcomeSteps } from '../shared.js'
+import { useDropzone } from 'react-dropzone'
export const namespaces = ['img']
@@ -19,10 +20,21 @@ const Tab = ({ id, activeTab, setActiveTab, t }) => (
const UsernameSettings = ({ app, title = false, welcome = false }) => {
const backend = useBackend(app)
const { t } = useTranslation(namespaces)
- const [bio, setBio] = useState(app.account.bio)
+
+ const [img, setImg] = useState(false)
+
+ const onDrop = useCallback((acceptedFiles) => {
+ const reader = new FileReader()
+ reader.onload = () => {
+ setImg(reader.result)
+ }
+ acceptedFiles.forEach((file) => reader.readAsDataURL(file))
+ }, [])
+
+ const { getRootProps, getInputProps } = useDropzone({ onDrop })
const save = async () => {
- const result = await backend.updateAccount({ bio })
+ const result = await backend.updateAccount({ img })
}
const nextHref = '/docs/guide'
@@ -30,9 +42,25 @@ const UsernameSettings = ({ app, title = false, welcome = false }) => {
return (
<>
{title ?
{t('title')}
: null}
- fixme
-