From 3bd2fbdb5658a02f86ad3edd116fdfefdcda27ec Mon Sep 17 00:00:00 2001 From: Nevo David Date: Wed, 13 Mar 2024 23:05:46 +0700 Subject: [PATCH] feat: fix dates, attachments --- apps/docs/favicon.ico | Bin 0 -> 15086 bytes apps/docs/favicon.png | Bin 4352 -> 1400 bytes apps/frontend/src/app/layout.tsx | 7 +- .../components/launches/add.edit.model.tsx | 79 ++++++------- .../launches/helpers/date.picker.tsx | 108 ++++++++++++++++++ .../providers/high.order.provider.tsx | 33 +++--- apps/frontend/tailwind.config.js | 8 +- .../database/prisma/posts/posts.service.ts | 44 +++---- package-lock.json | 30 +++++ package.json | 2 + 10 files changed, 226 insertions(+), 85 deletions(-) create mode 100644 apps/docs/favicon.ico mode change 100644 => 100755 apps/docs/favicon.png create mode 100644 apps/frontend/src/components/launches/helpers/date.picker.tsx diff --git a/apps/docs/favicon.ico b/apps/docs/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..317ebcb2336e0833a22dddf0ab287849f26fda57 GIT binary patch literal 15086 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 literal 4352 zcmZ{oWl$6V)5njLl$1E>k`#`-qdDM!1Ei#t4w3FoK|s2sj&2o>?iA@p8cFFmQaT=< zFYnCz;hCM?|IF_G=KpnPBh}w15aI#x0001?lA@gElk)vHaj>7NF8X!&lQ5VoYN`SN zK5PI$P$&R!^VAC30RY^e7WYg50MRr6fYJ%ktRen1z&2A>kOMsaH*(ubk^lgrGbK5h zw;z_L7i?;cwEg=|j_5|uhcBD78kHJxiJ=5AKKb0RZ=urCP=*hwA#-13$D4NyxRu{4 z(|jyrpMK2~5h1USV~`-z|BIMggMgui1rw@>&M4xkh;l92_8zUhL`8j|Dg<%-AHs|{`A7WUY`QCz_!M?ChMQlcp4cTUfR zhm=A$y3DXdSsV((obiNVUlnC zfHnjJcSOHqwP2sI2PUK6+0cRHEq0hcqB#h{;!{KHPPew4`*?0@FzQtgtWaM%d>sV_ zkbAfS{`zCT5kM4FuX0VL*ZQ?p>%7$vzL*SNXred|T(A!6gQtJyoWy~ng_qb{UQQM( zc`=5a<_0MV*mJcO5^%LwOa2zs?0IbENVA5i*SFDn_M!NAxYL1@+Jq)oXy(k@AX!=| zG`TO1%0AxNDq^&aX4UdGqbhdT4HU5BVubhz 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 + diff --git a/apps/frontend/src/components/launches/add.edit.model.tsx b/apps/frontend/src/components/launches/add.edit.model.tsx index bf4c1879..2d577eb3 100644 --- a/apps/frontend/src/components/launches/add.edit.model.tsx +++ b/apps/frontend/src/components/launches/add.edit.model.tsx @@ -37,12 +37,16 @@ import { useSWRConfig } from 'swr'; import { useToaster } from '@gitroom/react/toaster/toaster'; import { postSelector } from '@gitroom/frontend/components/post-url-selector/post.url.selector'; import { UpDownArrow } from '@gitroom/frontend/components/launches/up.down.arrow'; +import { DatePicker } from '@gitroom/frontend/components/launches/helpers/date.picker'; +import { arrayMoveImmutable } from 'array-move'; export const AddEditModal: FC<{ date: dayjs.Dayjs; integrations: Integrations[]; }> = (props) => { const { date, integrations } = props; + const [dateState, setDateState] = useState(date); + const { mutate } = useSWRConfig(); // selected integrations to allow edit @@ -115,47 +119,47 @@ export const AddEditModal: FC<{ target: { name: string; value?: Array<{ id: string; path: string }> }; }) => { return setValue((prev) => { - prev[index].image = newValue.target.value; - return [...prev]; + return prev.map((p, i) => { + if (i === index) { + return { ...p, image: newValue.target.value }; + } + return p; + }); }); }, - [value] + [] ); // Add another editor const addValue = useCallback( (index: number) => () => { setValue((prev) => { - prev.splice(index + 1, 0, { content: '' }); - return [...prev]; + return prev.reduce((acc, p, i) => { + acc.push(p); + if (i === index) { + acc.push({ content: '' }); + } + + return acc; + }, [] as Array<{ content: string }>); }); }, - [value] + [] ); const changePosition = useCallback( (index: number) => (type: 'up' | 'down') => { if (type === 'up' && index !== 0) { setValue((prev) => { - const temp = prev[index]; - prev[index] = prev[index - 1]; - prev[index - 1] = temp; - return [...prev]; + return arrayMoveImmutable(prev, index, index - 1); }); - } else if ( - type === 'down' && - value.length !== 0 && - value.length !== index + 1 - ) { + } else if (type === 'down') { setValue((prev) => { - const temp = prev[index]; - prev[index] = prev[index + 1]; - prev[index + 1] = temp; - return [...prev]; + return arrayMoveImmutable(prev, index, index + 1); }); } }, - [value] + [] ); // Delete post @@ -249,7 +253,7 @@ export const AddEditModal: FC<{ method: 'POST', body: JSON.stringify({ type, - date: date.utc().format('YYYY-MM-DDTHH:mm:ss'), + date: dateState.utc().format('YYYY-MM-DDTHH:mm:ss'), posts: allKeys, }), }); @@ -283,26 +287,9 @@ export const AddEditModal: FC<{ title={existingData?.group ? 'Edit Post' : 'Create Post'} /> - +
+ +
{!existingData.integration && ( f.name !== 'image'), newImage, - postSelector(date), + postSelector(dateState), ]} value={p.content} preview="edit" @@ -421,6 +408,12 @@ export const AddEditModal: FC<{
+ {!!existingData.integration && (
)} diff --git a/apps/frontend/src/components/launches/helpers/date.picker.tsx b/apps/frontend/src/components/launches/helpers/date.picker.tsx new file mode 100644 index 00000000..1419b0c0 --- /dev/null +++ b/apps/frontend/src/components/launches/helpers/date.picker.tsx @@ -0,0 +1,108 @@ +import { FC, useCallback, useState } from 'react'; +import dayjs from 'dayjs'; +import { Calendar, TimeInput } from '@mantine/dates'; +import { useClickOutside } from '@mantine/hooks'; +import { Button } from '@gitroom/react/form/button'; + +export const DatePicker: FC<{ + date: dayjs.Dayjs; + onChange: (day: dayjs.Dayjs) => void; +}> = (props) => { + const { date, onChange } = props; + const [open, setOpen] = useState(false); + + const changeShow = useCallback(() => { + setOpen((prev) => !prev); + }, []); + + const ref = useClickOutside(() => { + setOpen(false); + }); + + const changeDate = useCallback( + (type: 'date' | 'time') => (day: Date) => { + console.log( + type === 'time' + ? date.format('YYYY-MM-DD') + ' ' + dayjs(day).format('HH:mm:ss') + : dayjs(day).format('YYYY-MM-DD') + ' ' + date.format('HH:mm:ss') + ); + onChange( + dayjs( + type === 'time' + ? date.format('YYYY-MM-DD') + ' ' + dayjs(day).format('HH:mm:ss') + : dayjs(day).format('YYYY-MM-DD') + ' ' + date.format('HH:mm:ss') + ) + ); + }, + [date] + ); + + return ( +
+
{date.format('DD/MM/YYYY HH:mm')}
+
+ + + +
+ {open && ( +
e.stopPropagation()} + className="animate-normalFadeDown absolute top-[100%] mt-[16px] right-0 bg-sixth border border-tableBorder text-white rounded-[16px] z-[300] p-[16px] flex flex-col" + > + { + if (modifiers.weekend) { + return '!text-[#B69DEC]'; + } + + if (modifiers.outside) { + return '!text-gray'; + } + + if (modifiers.selected) { + return '!text-white !bg-seventh !outline-none'; + } + + return '!text-white'; + }} + classNames={{ + day: 'hover:bg-seventh', + calendarHeaderControl: 'text-white hover:bg-third', + calendarHeaderLevel: 'text-white hover:bg-third', // cell: 'child:!text-white' + }} + /> + + +
+ )} +
+ ); +}; diff --git a/apps/frontend/src/components/launches/providers/high.order.provider.tsx b/apps/frontend/src/components/launches/providers/high.order.provider.tsx index 75853682..c04ba7d5 100644 --- a/apps/frontend/src/components/launches/providers/high.order.provider.tsx +++ b/apps/frontend/src/components/launches/providers/high.order.provider.tsx @@ -27,6 +27,7 @@ import clsx from 'clsx'; import { newImage } from '@gitroom/frontend/components/launches/helpers/new.image.component'; import { postSelector } from '@gitroom/frontend/components/post-url-selector/post.url.selector'; import { UpDownArrow } from '@gitroom/frontend/components/launches/up.down.arrow'; +import { arrayMoveImmutable } from 'array-move'; // Simple component to change back to settings on after changing tab export const SetTab: FC<{ changeTab: () => void }> = (props) => { @@ -145,36 +146,32 @@ export const withProvider = ( const addValue = useCallback( (index: number) => () => { setInPlaceValue((prev) => { - prev.splice(index + 1, 0, { content: '' }); - return [...prev]; + return prev.reduce((acc, p, i) => { + acc.push(p); + if (i === index) { + acc.push({ content: '' }); + } + + return acc; + }, [] as Array<{ content: string }>); }); }, - [InPlaceValue] + [] ); const changePosition = useCallback( (index: number) => (type: 'up' | 'down') => { if (type === 'up' && index !== 0) { setInPlaceValue((prev) => { - const temp = prev[index]; - prev[index] = prev[index - 1]; - prev[index - 1] = temp; - return [...prev]; + return arrayMoveImmutable(prev, index, index - 1); }); - } else if ( - type === 'down' && - InPlaceValue.length !== 0 && - InPlaceValue.length !== index + 1 - ) { + } else if (type === 'down') { setInPlaceValue((prev) => { - const temp = prev[index]; - prev[index] = prev[index + 1]; - prev[index + 1] = temp; - return [...prev]; + return arrayMoveImmutable(prev, index, index + 1); }); } }, - [InPlaceValue] + [] ); // Delete post @@ -213,7 +210,7 @@ export const withProvider = ( setInPlaceValue( editInPlace ? [{ content: '' }] - : props.value.map((p) => ({ id: p.id, content: p.content })) + : props.value.map((p) => ({ id: p.id, content: p.content, image: p.image})) ); }, [props.value, editInPlace]); diff --git a/apps/frontend/tailwind.config.js b/apps/frontend/tailwind.config.js index 8c114584..751c5f1a 100644 --- a/apps/frontend/tailwind.config.js +++ b/apps/frontend/tailwind.config.js @@ -86,5 +86,11 @@ module.exports = { }), }, }, - plugins: [require('tailwind-scrollbar')], + plugins: [ + require('tailwind-scrollbar'), + function ({ addVariant }) { + addVariant('child', '& > *'); + addVariant('child-hover', '& > *:hover'); + }, + ], }; diff --git a/libraries/nestjs-libraries/src/database/prisma/posts/posts.service.ts b/libraries/nestjs-libraries/src/database/prisma/posts/posts.service.ts index 8cf07362..7c8672f4 100644 --- a/libraries/nestjs-libraries/src/database/prisma/posts/posts.service.ts +++ b/libraries/nestjs-libraries/src/database/prisma/posts/posts.service.ts @@ -213,28 +213,30 @@ export class PostsService { post ); - if (posts?.length) { - await this._workerServiceProducer.delete( - 'post', - previousPost ? previousPost : posts?.[0]?.id - ); - if ( - (body.type === 'schedule' || body.type === 'now') && - dayjs(body.date).isAfter(dayjs()) - ) { - this._workerServiceProducer.emit('post', { + if (!posts?.length) { + return; + } + + await this._workerServiceProducer.delete( + 'post', + previousPost ? previousPost : posts?.[0]?.id + ); + if ( + (body.type === 'schedule' || body.type === 'now') && + dayjs(body.date).isAfter(dayjs()) + ) { + this._workerServiceProducer.emit('post', { + id: posts[0].id, + options: { + delay: + body.type === 'now' + ? 0 + : dayjs(posts[0].publishDate).diff(dayjs(), 'millisecond'), + }, + payload: { id: posts[0].id, - options: { - delay: - body.type === 'now' - ? 0 - : dayjs(posts[0].publishDate).diff(dayjs(), 'millisecond'), - }, - payload: { - id: posts[0].id, - }, - }); - } + }, + }); } } } diff --git a/package-lock.json b/package-lock.json index d0e8b20e..ee009967 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,6 +15,7 @@ "@casl/ability": "^6.5.0", "@hookform/resolvers": "^3.3.4", "@mantine/core": "^5.10.5", + "@mantine/dates": "^5.10.5", "@mantine/hooks": "^5.10.5", "@mantine/modals": "^5.10.5", "@nestjs/cache-manager": "^2.2.1", @@ -40,6 +41,7 @@ "@uidotdev/usehooks": "^2.4.1", "@uiw/react-md-editor": "^4.0.3", "@virtual-grid/react": "^2.0.2", + "array-move": "^4.0.0", "axios": "1.6.7", "bcrypt": "^5.1.1", "bufferutil": "^4.0.8", @@ -148,6 +150,9 @@ "url-loader": "^4.1.1", "vite": "^5.0.0", "vitest": "1.3.1" + }, + "engines": { + "node": ">=20.0.0 <21.0.0" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -4397,6 +4402,20 @@ "react-dom": ">=16.8.0" } }, + "node_modules/@mantine/dates": { + "version": "5.10.5", + "resolved": "https://registry.npmjs.org/@mantine/dates/-/dates-5.10.5.tgz", + "integrity": "sha512-l7lSgDKEV+phTgUAHIkc/22Qgq+WBg0P7JS2WpeZeERX8eyD4BGlsY3ZWqHigYxhBq/Ycd2tHZFmwl2p+694Zw==", + "dependencies": { + "@mantine/utils": "5.10.5" + }, + "peerDependencies": { + "@mantine/core": "5.10.5", + "@mantine/hooks": "5.10.5", + "dayjs": ">=1.0.0", + "react": ">=16.8.0" + } + }, "node_modules/@mantine/hooks": { "version": "5.10.5", "resolved": "https://registry.npmjs.org/@mantine/hooks/-/hooks-5.10.5.tgz", @@ -13221,6 +13240,17 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/array-move": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/array-move/-/array-move-4.0.0.tgz", + "integrity": "sha512-+RY54S8OuVvg94THpneQvFRmqWdAHeqtMzgMW6JNurHxe8rsS07cHQdfGkXnTUXiBcyZ0j3SiDIxxj0RPiqCkQ==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/array-timsort": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/array-timsort/-/array-timsort-1.0.3.tgz", diff --git a/package.json b/package.json index 432a8eed..d1a3cbe8 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,7 @@ "@casl/ability": "^6.5.0", "@hookform/resolvers": "^3.3.4", "@mantine/core": "^5.10.5", + "@mantine/dates": "^5.10.5", "@mantine/hooks": "^5.10.5", "@mantine/modals": "^5.10.5", "@nestjs/cache-manager": "^2.2.1", @@ -44,6 +45,7 @@ "@uidotdev/usehooks": "^2.4.1", "@uiw/react-md-editor": "^4.0.3", "@virtual-grid/react": "^2.0.2", + "array-move": "^4.0.0", "axios": "1.6.7", "bcrypt": "^5.1.1", "bufferutil": "^4.0.8",