From ce60edb05381e6aa3f0abac8c268143b95bf1b75 Mon Sep 17 00:00:00 2001 From: Nevo David Date: Sat, 21 Jun 2025 12:35:33 +0700 Subject: [PATCH] feat: post to a community --- .../src/components/launches/providers/x/x.provider.tsx | 6 +++++- .../nestjs-libraries/src/dtos/posts/create.post.dto.ts | 2 ++ .../posts/providers-settings/all.providers.settings.ts | 2 ++ .../src/dtos/posts/providers-settings/x.dto.ts | 9 +++++++++ .../src/integrations/social/x.provider.ts | 7 +++++++ 5 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 libraries/nestjs-libraries/src/dtos/posts/providers-settings/x.dto.ts diff --git a/apps/frontend/src/components/launches/providers/x/x.provider.tsx b/apps/frontend/src/components/launches/providers/x/x.provider.tsx index 6601c82f..28515733 100644 --- a/apps/frontend/src/components/launches/providers/x/x.provider.tsx +++ b/apps/frontend/src/components/launches/providers/x/x.provider.tsx @@ -3,6 +3,8 @@ import { ThreadFinisher } from '@gitroom/frontend/components/launches/finisher/t import { Select } from '@gitroom/react/form/select'; import { useT } from '@gitroom/react/translation/get.transation.service.client'; import { useSettings } from '@gitroom/frontend/components/launches/helpers/use.values'; +import { XDto } from '@gitroom/nestjs-libraries/dtos/posts/providers-settings/x.dto'; +import { Input } from '@gitroom/react/form/input'; const whoCanReply = [ { @@ -48,6 +50,8 @@ const SettingsComponent = () => { ))} + + ); @@ -56,7 +60,7 @@ const SettingsComponent = () => { export default withProvider( SettingsComponent, undefined, - undefined, + XDto, async (posts) => { if (posts.some((p) => p.length > 4)) { return 'There can be maximum 4 pictures in a post.'; diff --git a/libraries/nestjs-libraries/src/dtos/posts/create.post.dto.ts b/libraries/nestjs-libraries/src/dtos/posts/create.post.dto.ts index 4f93246f..4a0cc5c7 100644 --- a/libraries/nestjs-libraries/src/dtos/posts/create.post.dto.ts +++ b/libraries/nestjs-libraries/src/dtos/posts/create.post.dto.ts @@ -26,6 +26,7 @@ import { TikTokDto } from '@gitroom/nestjs-libraries/dtos/posts/providers-settin import { DiscordDto } from '@gitroom/nestjs-libraries/dtos/posts/providers-settings/discord.dto'; import { SlackDto } from '@gitroom/nestjs-libraries/dtos/posts/providers-settings/slack.dto'; import { LemmySettingsDto } from '@gitroom/nestjs-libraries/dtos/posts/lemmy.dto'; +import { XDto } from '@gitroom/nestjs-libraries/dtos/posts/providers-settings/x.dto'; export class EmptySettings {} export class Integration { @@ -85,6 +86,7 @@ export class Post { { value: TikTokDto, name: 'tiktok' }, { value: DiscordDto, name: 'discord' }, { value: SlackDto, name: 'slack' }, + { value: XDto, name: 'x' }, ], }, }) diff --git a/libraries/nestjs-libraries/src/dtos/posts/providers-settings/all.providers.settings.ts b/libraries/nestjs-libraries/src/dtos/posts/providers-settings/all.providers.settings.ts index 2f6ad04c..9c1724a5 100644 --- a/libraries/nestjs-libraries/src/dtos/posts/providers-settings/all.providers.settings.ts +++ b/libraries/nestjs-libraries/src/dtos/posts/providers-settings/all.providers.settings.ts @@ -5,6 +5,7 @@ import { RedditSettingsDto } from '@gitroom/nestjs-libraries/dtos/posts/provider import { PinterestSettingsDto } from '@gitroom/nestjs-libraries/dtos/posts/providers-settings/pinterest.dto'; import { YoutubeSettingsDto } from '@gitroom/nestjs-libraries/dtos/posts/providers-settings/youtube.settings.dto'; import { TikTokDto } from '@gitroom/nestjs-libraries/dtos/posts/providers-settings/tiktok.dto'; +import { XDto } from '@gitroom/nestjs-libraries/dtos/posts/providers-settings/x.dto'; export type AllProvidersSettings = | DevToSettingsDto @@ -13,4 +14,5 @@ export type AllProvidersSettings = | RedditSettingsDto | YoutubeSettingsDto | PinterestSettingsDto + | XDto | TikTokDto; diff --git a/libraries/nestjs-libraries/src/dtos/posts/providers-settings/x.dto.ts b/libraries/nestjs-libraries/src/dtos/posts/providers-settings/x.dto.ts new file mode 100644 index 00000000..4677a1ce --- /dev/null +++ b/libraries/nestjs-libraries/src/dtos/posts/providers-settings/x.dto.ts @@ -0,0 +1,9 @@ +import { IsOptional, Matches } from 'class-validator'; + +export class XDto { + @IsOptional() + @Matches(/^(https:\/\/x\.com\/i\/communities\/\d+)?$/, { + message: 'Invalid X community URL. It should be in the format: https://x.com/i/communities/1493446837214187523', + }) + community: string; +} diff --git a/libraries/nestjs-libraries/src/integrations/social/x.provider.ts b/libraries/nestjs-libraries/src/integrations/social/x.provider.ts index 67891ab5..a3b8df2c 100644 --- a/libraries/nestjs-libraries/src/integrations/social/x.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/x.provider.ts @@ -241,6 +241,7 @@ export class XProvider extends SocialAbstract implements SocialProvider { postDetails: PostDetails<{ active_thread_finisher: boolean; thread_finisher: string; + community?: string; who_can_reply_post: | 'everyone' | 'following' @@ -311,6 +312,12 @@ export class XProvider extends SocialAbstract implements SocialProvider { : { reply_settings: postDetails?.[0]?.settings?.who_can_reply_post, }), + ...(postDetails?.[0]?.settings?.community + ? { + community_id: + postDetails?.[0]?.settings?.community?.split('/').pop() || '', + } + : {}), text: post.message, ...(media_ids.length ? { media: { media_ids } } : {}), ...(ids.length