From 455e72a2dcd8e3b5019f76d13a1d4a6b1880e5c9 Mon Sep 17 00:00:00 2001 From: ilya-bkv Date: Sat, 3 Dec 2022 11:21:37 +0300 Subject: [PATCH 01/18] [WiP] Upload ava --- src/context/profile.tsx | 2 -- src/graphql/types.gen.ts | 3 --- 2 files changed, 5 deletions(-) diff --git a/src/context/profile.tsx b/src/context/profile.tsx index 92a6cdd8..53b13d6e 100644 --- a/src/context/profile.tsx +++ b/src/context/profile.tsx @@ -22,7 +22,6 @@ const useProfileForm = () => { const [form, setForm] = createStore({ name: '', bio: '', - about: '', slug: '', userpic: '', links: [] @@ -37,7 +36,6 @@ const useProfileForm = () => { name: currentAuthor()?.name, slug: currentAuthor()?.name, bio: currentAuthor()?.bio, - about: currentAuthor()?.about, userpic: currentAuthor()?.userpic, links: currentAuthor()?.links }) diff --git a/src/graphql/types.gen.ts b/src/graphql/types.gen.ts index 9cd49925..5dd514cf 100644 --- a/src/graphql/types.gen.ts +++ b/src/graphql/types.gen.ts @@ -23,7 +23,6 @@ export type AuthResult = { export type Author = { bio?: Maybe - about?: Maybe caption?: Maybe id: Scalars['Int'] lastSeen?: Maybe @@ -334,8 +333,6 @@ export type Permission = { export type ProfileInput = { about?: InputMaybe bio?: InputMaybe - slug?: InputMaybe - about?: InputMaybe links?: InputMaybe>> name?: InputMaybe slug?: InputMaybe From b47192c7b27b99c9d352487cc2f0be49c0556e62 Mon Sep 17 00:00:00 2001 From: ilya-bkv Date: Sat, 3 Dec 2022 11:29:09 +0300 Subject: [PATCH 02/18] [WiP] Upload ava --- src/styles/Inbox.scss | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/styles/Inbox.scss b/src/styles/Inbox.scss index ea766bbe..5f6de16a 100644 --- a/src/styles/Inbox.scss +++ b/src/styles/Inbox.scss @@ -6,6 +6,7 @@ main { } .messages { + display: none; top: 74px; height: calc(100% - 74px); left: 0; @@ -13,11 +14,8 @@ main { padding-left: 42px; padding-right: 26px; background: #fff; - display: flex; flex: 1; flex-direction: column; - position: fixed; - z-index: 900; .row { flex: 1; From 762cbf2447c8b95ace7a3884525ce6f50313d8a6 Mon Sep 17 00:00:00 2001 From: ilya-bkv Date: Sat, 3 Dec 2022 13:35:48 +0300 Subject: [PATCH 03/18] test upload --- package.json | 1 + .../Pages/profile/ProfileSettingsPage.tsx | 18 ++++- src/pages/api/upload.ts | 79 +++++++++++++++---- yarn.lock | 34 +++++++- 4 files changed, 114 insertions(+), 18 deletions(-) diff --git a/package.json b/package.json index 738849c1..e7d858ba 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,7 @@ "@aws-sdk/s3-presigned-post": "^3.216.0", "@aws-sdk/signature-v4-multi-region": "^3.215.0", "@aws-sdk/util-user-agent-node": "^3.215.0", + "formidable": "^2.1.1", "mailgun.js": "^8.0.2" }, "devDependencies": { diff --git a/src/components/Pages/profile/ProfileSettingsPage.tsx b/src/components/Pages/profile/ProfileSettingsPage.tsx index a4e9d8f3..b10b6334 100644 --- a/src/components/Pages/profile/ProfileSettingsPage.tsx +++ b/src/components/Pages/profile/ProfileSettingsPage.tsx @@ -26,9 +26,23 @@ export const ProfileSettingsPage = (props: PageProps) => { selectFilesAsync(async ([{ source, name, size, file }]) => { try { console.log({ source, name, size, file }) - // DO UPLOAD STUFF HERE AND RETURN URL + const res = await fetch(`/api/upload?file=${name}&fileType=${file.type}`) + + const { url, fields } = await res.json() + const formData = new FormData() + + Object.entries({ ...fields, file }).forEach(([key, value]) => { + formData.append(key, value as string) + }) + + await fetch(url, { + method: 'POST', + body: formData + }).then((response) => { + console.log('!!! response:', response) + }) } catch (error) { - console.log(error) + console.log('[upload Error]', error) } }) } diff --git a/src/pages/api/upload.ts b/src/pages/api/upload.ts index 3113894b..8161a9f4 100644 --- a/src/pages/api/upload.ts +++ b/src/pages/api/upload.ts @@ -2,8 +2,49 @@ import { S3Client, PutObjectCommand } from '@aws-sdk/client-s3' import { createPresignedPost } from '@aws-sdk/s3-presigned-post' +import formidable from 'formidable' +import fs from 'fs' -export default async function handler(req, res) { +const putObject = async (s3Client, key, body, contentType) => { + // workaround for the issue: https://github.com/aws/aws-sdk-js-v3/issues/1800 + s3Client.middlewareStack.add( + (next, _context) => (args) => { + delete args.request.headers['content-type'] + return next(args) + }, + { + step: 'build' + } + ) + + const objectParams = { + ACL: 'public-read', + Bucket: process.env.S3_BUCKET_NAME, + Key: key, + Body: body, + ContentType: contentType + } + + const results = await s3Client.send(new PutObjectCommand(objectParams)) + return results +} + +const parseFormData = (req) => { + return new Promise((resolve, reject) => { + const form = new formidable.IncomingForm({ + multiples: true, + keepExtensions: true + }) + form.parse(req, (err, fields, files) => { + if (err) { + reject(err) + } + resolve({ fields, files }) + }) + }) +} + +export async function handler(req, res) { const s3Client = new S3Client({ region: process.env.S3_REGION || 'eu-west-1', credentials: { @@ -12,18 +53,28 @@ export default async function handler(req, res) { } }) - const post = await createPresignedPost(s3Client, { - Bucket: process.env.S3_BUCKET_NAME || 'discours-io', - Key: req.query.file, - Fields: { - acl: 'public-read', - 'Content-Type': req.query.fileType - }, - Expires: 600, // seconds - Conditions: [ - ['content-length-range', 0, 22 * 1048576] // up to 22 MB - ] - }) + if (req.method === 'POST') { + const data: any = await parseFormData(req) + const files = data?.files + const image = files.image + const body = fs.readFileSync(image.path) - res.status(200).json(post) + // const resp = await putObject(s3Client, image.name, body, image.type) + + const resp = await createPresignedPost(s3Client, { + Bucket: process.env.S3_BUCKET_NAME || 'discours-io', + Key: image.path, + Fields: { + acl: 'public-read', + 'Content-Type': image.type + }, + Expires: 600, // seconds + Conditions: [ + ['content-length-range', 0, 22 * 1048576] // up to 22 MB + ] + }) + return res.status(200).json(resp) + } + + return res.status(405).end() } diff --git a/yarn.lock b/yarn.lock index 5acfca4c..601836a5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3554,7 +3554,7 @@ arrify@^1.0.1: resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== -asap@~2.0.3: +asap@^2.0.0, asap@~2.0.3: version "2.0.6" resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== @@ -4633,6 +4633,14 @@ detect-node@^2.0.4: resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== +dezalgo@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.4.tgz#751235260469084c132157dfa857f386d4c33d81" + integrity sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig== + dependencies: + asap "^2.0.0" + wrappy "1" + diff-sequences@^29.3.1: version "29.3.1" resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.3.1.tgz#104b5b95fe725932421a9c6e5b4bef84c3f2249e" @@ -5715,6 +5723,16 @@ formdata-polyfill@^4.0.10: dependencies: fetch-blob "^3.1.2" +formidable@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/formidable/-/formidable-2.1.1.tgz#81269cbea1a613240049f5f61a9d97731517414f" + integrity sha512-0EcS9wCFEzLvfiks7omJ+SiYJAiD+TzK4Pcw1UlUoGnhUxDcMKjt0P7x8wEb0u6OHu8Nb98WG3nxtlF5C7bvUQ== + dependencies: + dezalgo "^1.0.4" + hexoid "^1.0.0" + once "^1.4.0" + qs "^6.11.0" + fs-minipass@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" @@ -6218,6 +6236,11 @@ header-case@^2.0.4: capital-case "^1.0.4" tslib "^2.0.3" +hexoid@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hexoid/-/hexoid-1.0.0.tgz#ad10c6573fb907de23d9ec63a711267d9dc9bc18" + integrity sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g== + hosted-git-info@^2.1.4: version "2.8.9" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" @@ -8491,7 +8514,7 @@ object.values@^1.1.5: define-properties "^1.1.4" es-abstract "^1.20.4" -once@^1.3.0: +once@^1.3.0, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== @@ -9128,6 +9151,13 @@ pvutils@^1.1.3: resolved "https://registry.yarnpkg.com/pvutils/-/pvutils-1.1.3.tgz#f35fc1d27e7cd3dfbd39c0826d173e806a03f5a3" integrity sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ== +qs@^6.11.0: + version "6.11.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" + integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== + dependencies: + side-channel "^1.0.4" + queue-microtask@^1.2.2, queue-microtask@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" From 953c12a0c6c95f7ce51dd3a51d27d00f8300f76c Mon Sep 17 00:00:00 2001 From: ilya-bkv Date: Sat, 3 Dec 2022 13:44:11 +0300 Subject: [PATCH 04/18] [WiP] test upload --- .../Pages/profile/ProfileSettingsPage.tsx | 23 +++++++------------ 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/src/components/Pages/profile/ProfileSettingsPage.tsx b/src/components/Pages/profile/ProfileSettingsPage.tsx index b10b6334..185776a3 100644 --- a/src/components/Pages/profile/ProfileSettingsPage.tsx +++ b/src/components/Pages/profile/ProfileSettingsPage.tsx @@ -24,25 +24,18 @@ export const ProfileSettingsPage = (props: PageProps) => { const handleUpload = () => { selectFilesAsync(async ([{ source, name, size, file }]) => { + const image = { source, name, size, file } try { - console.log({ source, name, size, file }) - const res = await fetch(`/api/upload?file=${name}&fileType=${file.type}`) - - const { url, fields } = await res.json() - const formData = new FormData() - - Object.entries({ ...fields, file }).forEach(([key, value]) => { - formData.append(key, value as string) - }) - - await fetch(url, { + let formData = new FormData() + formData.append('image', image.source) + const resp = await fetch('/api/upload?mime=' + image.file.type, { method: 'POST', body: formData - }).then((response) => { - console.log('!!! response:', response) }) - } catch (error) { - console.log('[upload Error]', error) + + console.log('!!! resp:', resp) + } catch (e) { + const resp = e.response } }) } From d79d88f2097e114a0c095861668879088beb3093 Mon Sep 17 00:00:00 2001 From: tonyrewin Date: Sat, 3 Dec 2022 14:00:29 +0300 Subject: [PATCH 05/18] api-moved --- {src/pages/api => api}/feedback.ts | 0 {src/pages/api => api}/newsletter.ts | 0 {src/pages/api => api}/upload.ts | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename {src/pages/api => api}/feedback.ts (100%) rename {src/pages/api => api}/newsletter.ts (100%) rename {src/pages/api => api}/upload.ts (100%) diff --git a/src/pages/api/feedback.ts b/api/feedback.ts similarity index 100% rename from src/pages/api/feedback.ts rename to api/feedback.ts diff --git a/src/pages/api/newsletter.ts b/api/newsletter.ts similarity index 100% rename from src/pages/api/newsletter.ts rename to api/newsletter.ts diff --git a/src/pages/api/upload.ts b/api/upload.ts similarity index 100% rename from src/pages/api/upload.ts rename to api/upload.ts From eca51b213a38cd721483c7addb0f84af3828e884 Mon Sep 17 00:00:00 2001 From: tonyrewin Date: Sat, 3 Dec 2022 14:05:19 +0300 Subject: [PATCH 06/18] move-back --- {api => src/pages/api}/feedback.ts | 0 {api => src/pages/api}/newsletter.ts | 0 {api => src/pages/api}/upload.ts | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename {api => src/pages/api}/feedback.ts (100%) rename {api => src/pages/api}/newsletter.ts (100%) rename {api => src/pages/api}/upload.ts (100%) diff --git a/api/feedback.ts b/src/pages/api/feedback.ts similarity index 100% rename from api/feedback.ts rename to src/pages/api/feedback.ts diff --git a/api/newsletter.ts b/src/pages/api/newsletter.ts similarity index 100% rename from api/newsletter.ts rename to src/pages/api/newsletter.ts diff --git a/api/upload.ts b/src/pages/api/upload.ts similarity index 100% rename from api/upload.ts rename to src/pages/api/upload.ts From 7c373697f0f457e8966659c1df7d34a322618935 Mon Sep 17 00:00:00 2001 From: ilya-bkv Date: Sat, 3 Dec 2022 14:17:19 +0300 Subject: [PATCH 07/18] Fix change fields --- src/components/Pages/profile/ProfileSettingsPage.tsx | 6 ++---- src/context/profile.tsx | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/components/Pages/profile/ProfileSettingsPage.tsx b/src/components/Pages/profile/ProfileSettingsPage.tsx index 185776a3..d2171e3d 100644 --- a/src/components/Pages/profile/ProfileSettingsPage.tsx +++ b/src/components/Pages/profile/ProfileSettingsPage.tsx @@ -32,10 +32,9 @@ export const ProfileSettingsPage = (props: PageProps) => { method: 'POST', body: formData }) - console.log('!!! resp:', resp) - } catch (e) { - const resp = e.response + } catch (error) { + console.log('!!! error', error) } }) } @@ -182,7 +181,6 @@ export const ProfileSettingsPage = (props: PageProps) => { -
{JSON.stringify(form, null, 2)}
diff --git a/src/context/profile.tsx b/src/context/profile.tsx index 53b13d6e..6f54a45d 100644 --- a/src/context/profile.tsx +++ b/src/context/profile.tsx @@ -34,7 +34,7 @@ const useProfileForm = () => { await loadAuthor({ slug: currentSlug() }) setForm({ name: currentAuthor()?.name, - slug: currentAuthor()?.name, + slug: currentAuthor()?.slug, bio: currentAuthor()?.bio, userpic: currentAuthor()?.userpic, links: currentAuthor()?.links From cd6f8a055168ad5f2dac141f650a12419816683f Mon Sep 17 00:00:00 2001 From: tonyrewin Date: Sat, 3 Dec 2022 15:26:35 +0300 Subject: [PATCH 08/18] jsext --- src/pages/api/{upload.ts => upload.js} | 2 +- vercel.json | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) rename src/pages/api/{upload.ts => upload.js} (97%) create mode 100644 vercel.json diff --git a/src/pages/api/upload.ts b/src/pages/api/upload.js similarity index 97% rename from src/pages/api/upload.ts rename to src/pages/api/upload.js index 8161a9f4..ddd8920b 100644 --- a/src/pages/api/upload.ts +++ b/src/pages/api/upload.js @@ -54,7 +54,7 @@ export async function handler(req, res) { }) if (req.method === 'POST') { - const data: any = await parseFormData(req) + const data = await parseFormData(req) const files = data?.files const image = files.image const body = fs.readFileSync(image.path) diff --git a/vercel.json b/vercel.json new file mode 100644 index 00000000..da21031f --- /dev/null +++ b/vercel.json @@ -0,0 +1,8 @@ +{ + "functions": { + "pages/api/upload.js": { + "memory": 3008, + "maxDuration": 30 + } + } +} From 05494e4cc80fba422bb1b518ddc6b736faf4b628 Mon Sep 17 00:00:00 2001 From: tonyrewin Date: Sat, 3 Dec 2022 15:33:03 +0300 Subject: [PATCH 09/18] autoapi --- vercel.json | 8 -------- 1 file changed, 8 deletions(-) delete mode 100644 vercel.json diff --git a/vercel.json b/vercel.json deleted file mode 100644 index da21031f..00000000 --- a/vercel.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "functions": { - "pages/api/upload.js": { - "memory": 3008, - "maxDuration": 30 - } - } -} From a17811d7890e96a52fc3dc1c3c849a159519c4a6 Mon Sep 17 00:00:00 2001 From: tonyrewin Date: Sat, 3 Dec 2022 16:11:39 +0300 Subject: [PATCH 10/18] verceljson --- vercel.json | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 vercel.json diff --git a/vercel.json b/vercel.json new file mode 100644 index 00000000..65fc6185 --- /dev/null +++ b/vercel.json @@ -0,0 +1,8 @@ +{ + "functions": { + "src/pages/api/**/*": { + "memory": 3008, + "maxDuration": 30 + } + } +} From d3f7dbc991b2d3347992dd0e8f22c0d20af0260b Mon Sep 17 00:00:00 2001 From: tonyrewin Date: Sat, 3 Dec 2022 16:16:36 +0300 Subject: [PATCH 11/18] js --- vercel.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vercel.json b/vercel.json index 65fc6185..e8de235d 100644 --- a/vercel.json +++ b/vercel.json @@ -1,6 +1,6 @@ { "functions": { - "src/pages/api/**/*": { + "src/pages/api/*.js": { "memory": 3008, "maxDuration": 30 } From bf77a05531bd9d36f07ff07bbf9ef164ea9dfdd8 Mon Sep 17 00:00:00 2001 From: tonyrewin Date: Sun, 4 Dec 2022 12:46:13 +0300 Subject: [PATCH 12/18] userpic-upload --- src/pages/api/feedback.ts => api/feedback.js | 3 +- {src/pages/api => api}/newsletter.ts | 2 +- api/upload.ts | 87 +++++++++++ package.json | 4 +- .../Pages/profile/ProfileSettingsPage.tsx | 22 ++- src/pages/api/upload.js | 80 ---------- vercel.json | 6 +- yarn.lock | 144 +++++++++++++++--- 8 files changed, 228 insertions(+), 120 deletions(-) rename src/pages/api/feedback.ts => api/feedback.js (91%) rename {src/pages/api => api}/newsletter.ts (93%) create mode 100644 api/upload.ts delete mode 100644 src/pages/api/upload.js diff --git a/src/pages/api/feedback.ts b/api/feedback.js similarity index 91% rename from src/pages/api/feedback.ts rename to api/feedback.js index 49ab3d18..b33e47d6 100644 --- a/src/pages/api/feedback.ts +++ b/api/feedback.js @@ -1,6 +1,5 @@ import MG from 'mailgun.js' import fd from 'form-data' -import type Options from 'mailgun.js/interfaces/Options' const mgOptions = { key: process.env.MAILGUN_API_KEY, @@ -25,7 +24,7 @@ export default async function handler(req, res) { key: mgOptions.key //url?: string; //public_key?: string; - } as Options) + }) const data = messageData(`${contact}: ${subject}`, message) client.messages.create(mgOptions.domain, data).then(console.log).catch(console.error) } catch (error) { diff --git a/src/pages/api/newsletter.ts b/api/newsletter.ts similarity index 93% rename from src/pages/api/newsletter.ts rename to api/newsletter.ts index 7c1e6965..7467f8fd 100644 --- a/src/pages/api/newsletter.ts +++ b/api/newsletter.ts @@ -22,6 +22,6 @@ export default async function handler(req, res) { } */ -export const handler = () => { +export const handler = (req, res) => { return 'WIP' } diff --git a/api/upload.ts b/api/upload.ts new file mode 100644 index 00000000..86551399 --- /dev/null +++ b/api/upload.ts @@ -0,0 +1,87 @@ +import { Writable } from 'stream' +import formidable from 'formidable' +import { S3Client } from '@aws-sdk/client-s3' +import { Upload } from '@aws-sdk/lib-storage' + +export const config = { + api: { + bodyParser: false + } +} + +const BUCKET_NAME = process.env.S3_BUCKET || 'discours-io' +const s3 = new S3Client({ + region: process.env.S3_REGION || 'eu-west-1', + credentials: { + accessKeyId: process.env.S3_ACCESS_KEY, + secretAccessKey: process.env.S3_SECRET_KEY + } +}) + +const formidableConfig = { + keepExtensions: true, + maxFileSize: 10_000_000, + maxFieldsSize: 10_000_000, + maxFields: 7, + allowEmptyFiles: false, + multiples: false +} + +const formidablePromise = async (req, opts) => { + return new Promise((accept, reject) => { + const form = formidable(opts) + + form.parse(req, (err, fields, files) => { + if (err) { + return reject(err) + } + return accept({ fields, files }) + }) + }) +} + +const fileConsumer = (acc) => { + const writable = new Writable({ + write: (chunk, _enc, next) => { + acc.push(chunk) + next() + } + }) + + return writable +} + +async function handler(req, res) { + if (req.method === 'POST') { + try { + const chunks = [] + const { fields, files }: any = await formidablePromise(req, { + ...formidableConfig, + // consume this, otherwise formidable tries to save the file to disk + fileWriteStreamHandler: () => fileConsumer(chunks) + }) + + const data = Buffer.concat(chunks) + + const params = { + Bucket: process.env.S3_BUCKET || 'discours-io', + Key: fields.name + '.' + fields.ext, + Body: data, + ACL: 'public-read', + 'Content-Type': fields.type + } + + const upload = new Upload({ params, client: s3 }) + await upload.done() + // console.log(upload) + const { singleUploadResult: result }: any = upload + return res.status(200).json(result.Location) + } catch (error) { + console.error(error) + } + } + + return res.status(405).end() +} + +export default handler diff --git a/package.json b/package.json index e7d858ba..96f727c7 100644 --- a/package.json +++ b/package.json @@ -33,9 +33,7 @@ }, "dependencies": { "@aws-sdk/client-s3": "^3.216.0", - "@aws-sdk/s3-presigned-post": "^3.216.0", - "@aws-sdk/signature-v4-multi-region": "^3.215.0", - "@aws-sdk/util-user-agent-node": "^3.215.0", + "@aws-sdk/lib-storage": "^3.223.0", "formidable": "^2.1.1", "mailgun.js": "^8.0.2" }, diff --git a/src/components/Pages/profile/ProfileSettingsPage.tsx b/src/components/Pages/profile/ProfileSettingsPage.tsx index d2171e3d..052ce0a6 100644 --- a/src/components/Pages/profile/ProfileSettingsPage.tsx +++ b/src/components/Pages/profile/ProfileSettingsPage.tsx @@ -3,7 +3,7 @@ import { t } from '../../../utils/intl' import type { PageProps } from '../../types' import { Icon } from '../../_shared/Icon' import ProfileSettingsNavigation from '../../Discours/ProfileSettingsNavigation' -import { For, createSignal, Show } from 'solid-js' +import { For, createSignal, Show, onMount } from 'solid-js' import { clsx } from 'clsx' import styles from './Settings.module.scss' import { useProfileForm } from '../../../context/profile' @@ -20,24 +20,30 @@ export const ProfileSettingsPage = (props: PageProps) => { event.preventDefault() submit(form) } - const { selectFiles: selectFilesAsync } = createFileUploader({ accept: 'image/*' }) + + const { files, selectFiles: selectFilesAsync } = createFileUploader({ accept: 'image/*' }) const handleUpload = () => { selectFilesAsync(async ([{ source, name, size, file }]) => { const image = { source, name, size, file } try { let formData = new FormData() - formData.append('image', image.source) - const resp = await fetch('/api/upload?mime=' + image.file.type, { + formData.append('type', file.type) + formData.append('name', image.source.split('/').pop()) + formData.append('ext', image.name.split('.').pop()) + const resp = await fetch('/api/upload', { method: 'POST', body: formData }) - console.log('!!! resp:', resp) + const url = await resp.json() + updateFormField('userpic', url) } catch (error) { - console.log('!!! error', error) + console.error('[upload] error', error) } }) } + const [hostname, setHostname] = createSignal('new.discours.io') + onMount(() => setHostname(window?.location.host)) return ( @@ -58,7 +64,7 @@ export const ProfileSettingsPage = (props: PageProps) => {
{form.name} -

{t('Name')}

@@ -82,7 +88,7 @@ export const ProfileSettingsPage = (props: PageProps) => {

{t('Address on Discourse')}

- +
{ - // workaround for the issue: https://github.com/aws/aws-sdk-js-v3/issues/1800 - s3Client.middlewareStack.add( - (next, _context) => (args) => { - delete args.request.headers['content-type'] - return next(args) - }, - { - step: 'build' - } - ) - - const objectParams = { - ACL: 'public-read', - Bucket: process.env.S3_BUCKET_NAME, - Key: key, - Body: body, - ContentType: contentType - } - - const results = await s3Client.send(new PutObjectCommand(objectParams)) - return results -} - -const parseFormData = (req) => { - return new Promise((resolve, reject) => { - const form = new formidable.IncomingForm({ - multiples: true, - keepExtensions: true - }) - form.parse(req, (err, fields, files) => { - if (err) { - reject(err) - } - resolve({ fields, files }) - }) - }) -} - -export async function handler(req, res) { - const s3Client = new S3Client({ - region: process.env.S3_REGION || 'eu-west-1', - credentials: { - accessKeyId: process.env.S3_ACCESS_KEY, - secretAccessKey: process.env.S3_SECRET_KEY - } - }) - - if (req.method === 'POST') { - const data = await parseFormData(req) - const files = data?.files - const image = files.image - const body = fs.readFileSync(image.path) - - // const resp = await putObject(s3Client, image.name, body, image.type) - - const resp = await createPresignedPost(s3Client, { - Bucket: process.env.S3_BUCKET_NAME || 'discours-io', - Key: image.path, - Fields: { - acl: 'public-read', - 'Content-Type': image.type - }, - Expires: 600, // seconds - Conditions: [ - ['content-length-range', 0, 22 * 1048576] // up to 22 MB - ] - }) - return res.status(200).json(resp) - } - - return res.status(405).end() -} diff --git a/vercel.json b/vercel.json index e8de235d..6e6c0c0e 100644 --- a/vercel.json +++ b/vercel.json @@ -1,6 +1,10 @@ { "functions": { - "src/pages/api/*.js": { + "api/upload.ts": { + "memory": 3008, + "maxDuration": 30 + }, + "api/feedback.js": { "memory": 3008, "maxDuration": 30 } diff --git a/yarn.lock b/yarn.lock index 601836a5..b32e6f75 100644 --- a/yarn.lock +++ b/yarn.lock @@ -630,6 +630,18 @@ dependencies: tslib "^2.3.1" +"@aws-sdk/lib-storage@^3.223.0": + version "3.223.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/lib-storage/-/lib-storage-3.223.0.tgz#c7852e1096ca95fbea57e7963c8eb065d6b2f62e" + integrity sha512-MZmXUemwHyItiZ0Nm/gg47QWYcd04fk2o4+MFziX38kjM2F3lIA+4aSBX78z5Bkrnpd0xdMh0Tl4TmwHYfmsrg== + dependencies: + "@aws-sdk/middleware-endpoint" "3.222.0" + "@aws-sdk/smithy-client" "3.222.0" + buffer "5.6.0" + events "3.3.0" + stream-browserify "3.0.0" + tslib "^2.3.1" + "@aws-sdk/md5-js@3.215.0": version "3.215.0" resolved "https://registry.yarnpkg.com/@aws-sdk/md5-js/-/md5-js-3.215.0.tgz#54c3874c61066a90706c523a056418c4ca68340a" @@ -674,6 +686,20 @@ "@aws-sdk/util-middleware" "3.215.0" tslib "^2.3.1" +"@aws-sdk/middleware-endpoint@3.222.0": + version "3.222.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-endpoint/-/middleware-endpoint-3.222.0.tgz#7494bde024f05d88810408b41f51a87c91b626c1" + integrity sha512-e1bM+CvuUWmBdydQpV5sF8cxZrXQ++0G5s1M7pLimKdWXQvCQ1ZEwA3LLi2IWomXmS9a3BaH3iKAf87RTWjIXw== + dependencies: + "@aws-sdk/middleware-serde" "3.222.0" + "@aws-sdk/protocol-http" "3.222.0" + "@aws-sdk/signature-v4" "3.222.0" + "@aws-sdk/types" "3.222.0" + "@aws-sdk/url-parser" "3.222.0" + "@aws-sdk/util-config-provider" "3.208.0" + "@aws-sdk/util-middleware" "3.222.0" + tslib "^2.3.1" + "@aws-sdk/middleware-expect-continue@3.215.0": version "3.215.0" resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.215.0.tgz#189af8a5eb9c80f5d1a1014f4e6f8c1503b1cdbe" @@ -772,6 +798,14 @@ "@aws-sdk/types" "3.215.0" tslib "^2.3.1" +"@aws-sdk/middleware-serde@3.222.0": + version "3.222.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-serde/-/middleware-serde-3.222.0.tgz#b4decb3bbb8e373d393e0c607b5af175cbfc2396" + integrity sha512-UoeLbgCJB07dX8tRByR0KzZaOwCoIyXj/SfFTuOhBUjkpKwqFCam/hofDlK3FR6kvl+xiURv57W/FtKV/9TDHg== + dependencies: + "@aws-sdk/types" "3.222.0" + tslib "^2.3.1" + "@aws-sdk/middleware-signing@3.215.0": version "3.215.0" resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-signing/-/middleware-signing-3.215.0.tgz#f86febdae93066749f0715997121135eea2f6867" @@ -799,6 +833,13 @@ dependencies: tslib "^2.3.1" +"@aws-sdk/middleware-stack@3.222.0": + version "3.222.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-stack/-/middleware-stack-3.222.0.tgz#c55b4f8408e6b111f25ca3a5ce24118e54968dfd" + integrity sha512-ASKbstAKbOBUZhFhst6/NCr11x94BDBiQn2zDs2Lvjo89n2efMeb4wEr17VCMZVeKI6ojtPFa1ZVLsH8AOn4Yw== + dependencies: + tslib "^2.3.1" + "@aws-sdk/middleware-user-agent@3.215.0": version "3.215.0" resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.215.0.tgz#24c87d5e8e4c31a5a274403d503e72cb99ac85ed" @@ -845,6 +886,14 @@ "@aws-sdk/types" "3.215.0" tslib "^2.3.1" +"@aws-sdk/protocol-http@3.222.0": + version "3.222.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/protocol-http/-/protocol-http-3.222.0.tgz#c5f82957d304bb2eb31a117c9a5d86a7772b4f86" + integrity sha512-Zj+ytEgrOagCE7yczjdDan7W+1a0OL5DPAx69Z00NxGoBI2h0GRZD28dRYb3Pzs5/Ft4KbCedH/RUnyaYjaZxw== + dependencies: + "@aws-sdk/types" "3.222.0" + tslib "^2.3.1" + "@aws-sdk/querystring-builder@3.215.0": version "3.215.0" resolved "https://registry.yarnpkg.com/@aws-sdk/querystring-builder/-/querystring-builder-3.215.0.tgz#2a8b21560bdf24e6b24ef31c4287da4e0c459ed4" @@ -862,16 +911,12 @@ "@aws-sdk/types" "3.215.0" tslib "^2.3.1" -"@aws-sdk/s3-presigned-post@^3.216.0": - version "3.216.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/s3-presigned-post/-/s3-presigned-post-3.216.0.tgz#690627a7191c60f933225352e46d20fb27683bdd" - integrity sha512-NlwZW/wRzQvwBKzEc4bS0i6iduxHgUWf3ImYxPKwArE0U/vxK6bXnNSvy24VsiXuvz99lY09batmFvomzstIYA== +"@aws-sdk/querystring-parser@3.222.0": + version "3.222.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/querystring-parser/-/querystring-parser-3.222.0.tgz#2b53b529d8c3ce347ac1900bcf16e728fe4e28b7" + integrity sha512-3KfkCA/753PlF5QqhGuQ7u+NOgLyiBFeV8R8ut/pfBmG8fF6l3RKrkbcu+87QpqXntRzG+RLHDqS7ryT3B2ICg== dependencies: - "@aws-sdk/middleware-endpoint" "3.215.0" - "@aws-sdk/signature-v4" "3.215.0" - "@aws-sdk/types" "3.215.0" - "@aws-sdk/util-format-url" "3.215.0" - "@aws-sdk/util-hex-encoding" "3.201.0" + "@aws-sdk/types" "3.222.0" tslib "^2.3.1" "@aws-sdk/service-error-classification@3.215.0": @@ -887,7 +932,7 @@ "@aws-sdk/types" "3.215.0" tslib "^2.3.1" -"@aws-sdk/signature-v4-multi-region@3.215.0", "@aws-sdk/signature-v4-multi-region@^3.215.0": +"@aws-sdk/signature-v4-multi-region@3.215.0": version "3.215.0" resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.215.0.tgz#20349ce6f1fe3a8f4597db230c76afe82ab079b2" integrity sha512-XOUUNWs6I4vAa+Byj6qL/+DCWA5CjcRyA9sitYy8sNqhLcet8WoYf7vJL2LW1nvdzRb/pGBNWLiQOZ+9sadYeg== @@ -910,6 +955,18 @@ "@aws-sdk/util-uri-escape" "3.201.0" tslib "^2.3.1" +"@aws-sdk/signature-v4@3.222.0": + version "3.222.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4/-/signature-v4-3.222.0.tgz#1c96d67d172eb68a89240eed834489d2ed79700b" + integrity sha512-2qQZuKqx56b2uN2rdjdKL6u0Cvk82uTGNtIuetmySY9xPEAljSBdriaxTqNqK9Gs3M4obG22alUK4a85uwqS3g== + dependencies: + "@aws-sdk/is-array-buffer" "3.201.0" + "@aws-sdk/types" "3.222.0" + "@aws-sdk/util-hex-encoding" "3.201.0" + "@aws-sdk/util-middleware" "3.222.0" + "@aws-sdk/util-uri-escape" "3.201.0" + tslib "^2.3.1" + "@aws-sdk/smithy-client@3.215.0": version "3.215.0" resolved "https://registry.yarnpkg.com/@aws-sdk/smithy-client/-/smithy-client-3.215.0.tgz#cda96b076f7df19157340623872a8914f2a3bb8c" @@ -919,6 +976,15 @@ "@aws-sdk/types" "3.215.0" tslib "^2.3.1" +"@aws-sdk/smithy-client@3.222.0": + version "3.222.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/smithy-client/-/smithy-client-3.222.0.tgz#c7dddbd82e9da4d3fc1416c98169593635873bd9" + integrity sha512-4dnU7TvwKxVuOWduvFGClYe0EgNov5Ke1ef7O1bdKaj5MmlH6wBDgGJM4NKREBFapC2dUXkoPtwsihtYBci1Bw== + dependencies: + "@aws-sdk/middleware-stack" "3.222.0" + "@aws-sdk/types" "3.222.0" + tslib "^2.3.1" + "@aws-sdk/token-providers@3.216.0": version "3.216.0" resolved "https://registry.yarnpkg.com/@aws-sdk/token-providers/-/token-providers-3.216.0.tgz#b158ef490ed002d5956d8d855627297a551963d6" @@ -935,6 +1001,11 @@ resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.215.0.tgz#72a595e2c1a5c8c3f0291bccf71d481412b1843b" integrity sha512-eRbCVjwzTYd9C5e2mceScJ6D2kYDDEC3PLkYfJa+1wH9iiF2JlbiYozAokyeYBHQ+AjmD93MK58RBoM8iZfH0Q== +"@aws-sdk/types@3.222.0": + version "3.222.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.222.0.tgz#e61eb257f0ad2eaa65f7a72b9a2882f914fbcbb5" + integrity sha512-yXRYptInkfEFaOvWFxlRXsRh9jWOmQc1sZeKqjfx2UCtzNJ7ebedN0VfCz4SaDotcw9Q4JWuN66qhRMJjDx7/w== + "@aws-sdk/url-parser@3.215.0": version "3.215.0" resolved "https://registry.yarnpkg.com/@aws-sdk/url-parser/-/url-parser-3.215.0.tgz#4accbedd5fb81dc2f18e28f0f50dbd781b0b63a1" @@ -944,6 +1015,15 @@ "@aws-sdk/types" "3.215.0" tslib "^2.3.1" +"@aws-sdk/url-parser@3.222.0": + version "3.222.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/url-parser/-/url-parser-3.222.0.tgz#74118f3d824d2bb7415fe909c4db62aff5f42667" + integrity sha512-1+QbVdT/phYDb5JDQRJWoZeCujkXaI5m8z3bIiPxcRRY3NPuluDGrfX3kfnFen5s9QGByLvJxWKWZS+i+iUFRg== + dependencies: + "@aws-sdk/querystring-parser" "3.222.0" + "@aws-sdk/types" "3.222.0" + tslib "^2.3.1" + "@aws-sdk/util-arn-parser@3.208.0": version "3.208.0" resolved "https://registry.yarnpkg.com/@aws-sdk/util-arn-parser/-/util-arn-parser-3.208.0.tgz#56b6ae4699c3140bb27dcede5146876fef04e823" @@ -1018,15 +1098,6 @@ "@aws-sdk/types" "3.215.0" tslib "^2.3.1" -"@aws-sdk/util-format-url@3.215.0": - version "3.215.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-format-url/-/util-format-url-3.215.0.tgz#dcdccccbc810911a65b871f0341dbcefc8474272" - integrity sha512-j8X2pIwpSxtS23Za6t36pQjeVe5ouunoMuOj4wdj2uB3Cbf2vvd84J5lF8bUHQA35f5PRqdYtU1KyolQudCXsA== - dependencies: - "@aws-sdk/querystring-builder" "3.215.0" - "@aws-sdk/types" "3.215.0" - tslib "^2.3.1" - "@aws-sdk/util-hex-encoding@3.201.0": version "3.201.0" resolved "https://registry.yarnpkg.com/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.201.0.tgz#21d7ec319240ee68c33d938e71cb79830bea315d" @@ -1048,6 +1119,13 @@ dependencies: tslib "^2.3.1" +"@aws-sdk/util-middleware@3.222.0": + version "3.222.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-middleware/-/util-middleware-3.222.0.tgz#e23a5109081769762492890672b15ea54297bd0e" + integrity sha512-Y4BPtSa+6+qvg6OVW6RrdDx0OADfWa2Uxsxqdozpdnx2OQY0q+1diqsNgFMV+FIvdXqffE147KG7roG+/AfPeA== + dependencies: + tslib "^2.3.1" + "@aws-sdk/util-stream-browser@3.215.0": version "3.215.0" resolved "https://registry.yarnpkg.com/@aws-sdk/util-stream-browser/-/util-stream-browser-3.215.0.tgz#6439e76dcc90cb535ab5fb882c6d669aa74f7c79" @@ -1086,7 +1164,7 @@ bowser "^2.11.0" tslib "^2.3.1" -"@aws-sdk/util-user-agent-node@3.215.0", "@aws-sdk/util-user-agent-node@^3.215.0": +"@aws-sdk/util-user-agent-node@3.215.0": version "3.215.0" resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.215.0.tgz#620beb9ba2b2775cdf51e39789ea919b10b4d903" integrity sha512-4lrdd1oGRwJEwfvgvg1jcJ2O0bwElsvtiqZfTRHN6MNTFUqsKl0xHlgFChQsz3Hfrc1niWtZCmbqQKGdO5ARpw== @@ -3840,7 +3918,7 @@ base-64@^1.0.0: resolved "https://registry.yarnpkg.com/base-64/-/base-64-1.0.0.tgz#09d0f2084e32a3fd08c2475b973788eee6ae8f4a" integrity sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg== -base64-js@^1.3.1: +base64-js@^1.0.2, base64-js@^1.3.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== @@ -3961,6 +4039,14 @@ buffer-from@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== +buffer@5.6.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.6.0.tgz#a31749dc7d81d84db08abf937b6b8c4033f62786" + integrity sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + buffer@^5.5.0: version "5.7.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" @@ -5457,7 +5543,7 @@ event-target-shim@^5.0.0: resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== -events@^3.3.0: +events@3.3.0, events@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== @@ -6337,7 +6423,7 @@ idb@^7.1.1: resolved "https://registry.yarnpkg.com/idb/-/idb-7.1.1.tgz#d910ded866d32c7ced9befc5bfdf36f572ced72b" integrity sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ== -ieee754@^1.1.13, ieee754@^1.2.1: +ieee754@^1.1.13, ieee754@^1.1.4, ieee754@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== @@ -6401,7 +6487,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.3, inherits@^2.0.4: +inherits@2, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -9199,7 +9285,7 @@ read-pkg@^5.2.0: parse-json "^5.0.0" type-fest "^0.6.0" -readable-stream@^3.4.0, readable-stream@^3.6.0: +readable-stream@^3.4.0, readable-stream@^3.5.0, readable-stream@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== @@ -9963,6 +10049,14 @@ stack-utils@^2.0.3: dependencies: escape-string-regexp "^2.0.0" +stream-browserify@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-3.0.0.tgz#22b0a2850cdf6503e73085da1fc7b7d0c2122f2f" + integrity sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA== + dependencies: + inherits "~2.0.4" + readable-stream "^3.5.0" + streamsearch@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" From ad2dc2f146ef1e2dd030e3f25fc28333c664fd81 Mon Sep 17 00:00:00 2001 From: ilya-bkv Date: Tue, 6 Dec 2022 06:41:49 +0300 Subject: [PATCH 13/18] hide about field --- .../Pages/profile/ProfileSettingsPage.tsx | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/components/Pages/profile/ProfileSettingsPage.tsx b/src/components/Pages/profile/ProfileSettingsPage.tsx index 052ce0a6..04e5f242 100644 --- a/src/components/Pages/profile/ProfileSettingsPage.tsx +++ b/src/components/Pages/profile/ProfileSettingsPage.tsx @@ -113,19 +113,19 @@ export const ProfileSettingsPage = (props: PageProps) => {
-

{t('About myself')}

-
-