'LinkedIn', self::LinkedInPage => 'LinkedIn Page', self::X => 'X', self::TikTok => 'TikTok', self::YouTube => 'YouTube Shorts', self::Facebook => 'Facebook Page', self::Instagram => 'Instagram (Standalone)', self::InstagramFacebook => 'Instagram (Facebook Business)', self::Threads => 'Threads', self::Pinterest => 'Pinterest', self::Bluesky => 'Bluesky', self::Mastodon => 'Mastodon', }; } public function color(): string { return match ($this) { self::LinkedIn, self::LinkedInPage => '#0A66C2', self::X => '#000000', self::TikTok => '#000000', self::YouTube => '#FF0000', self::Facebook => '#1877F2', self::Instagram => '#E4405F', self::InstagramFacebook => '#E4405F', self::Threads => '#000000', self::Pinterest => '#E60023', self::Bluesky => '#0085FF', self::Mastodon => '#6364FF', }; } public function allowedMediaTypes(): array { return match ($this) { self::LinkedIn, self::LinkedInPage => [MediaType::Image, MediaType::Video, MediaType::Document], self::X => [MediaType::Image, MediaType::Video], self::TikTok => [MediaType::Video], self::YouTube => [MediaType::Video], self::Facebook => [MediaType::Image, MediaType::Video], self::Instagram, self::InstagramFacebook => [MediaType::Image, MediaType::Video], self::Threads => [MediaType::Image, MediaType::Video], self::Pinterest => [MediaType::Image, MediaType::Video], self::Bluesky => [MediaType::Image, MediaType::Video], self::Mastodon => [MediaType::Image, MediaType::Video], }; } public function maxImages(): int { return match ($this) { self::LinkedIn, self::LinkedInPage => 1, self::X => 4, self::TikTok => 0, self::YouTube => 0, self::Facebook => 10, self::Instagram, self::InstagramFacebook => 10, self::Threads => 10, self::Pinterest => 5, self::Bluesky => 4, self::Mastodon => 4, }; } public function maxContentLength(): int { return match ($this) { self::LinkedIn, self::LinkedInPage => 3000, self::X => 280, self::TikTok => 2200, self::YouTube => 5000, self::Facebook => 63206, self::Instagram, self::InstagramFacebook => 2200, self::Threads => 500, self::Pinterest => 800, self::Bluesky => 300, self::Mastodon => 500, }; } /** * @return array */ public function requiredPublishScopes(): array { return match ($this) { self::Instagram => ['instagram_business_content_publish'], self::InstagramFacebook => ['instagram_content_publish'], self::Facebook => ['pages_manage_posts'], self::TikTok => ['video.publish'], self::YouTube => ['https://www.googleapis.com/auth/youtube.upload'], self::LinkedIn => ['w_member_social'], self::LinkedInPage => ['w_organization_social'], self::X => ['tweet.write'], self::Threads => ['threads_content_publish'], self::Pinterest => ['pins:write'], self::Bluesky => [], self::Mastodon => ['write:statuses'], }; } public function supportsTextOnly(): bool { return match ($this) { self::LinkedIn, self::LinkedInPage => true, self::X => true, self::TikTok => false, self::YouTube => false, self::Facebook => true, self::Instagram, self::InstagramFacebook => false, self::Threads => true, self::Pinterest => false, self::Bluesky => true, self::Mastodon => true, }; } public function requiresContent(): bool { return match ($this) { self::YouTube => true, default => false, }; } public function queue(): string { return 'social-'.$this->value; } /** * @return array */ public static function allQueues(): array { return array_map(fn (self $platform) => $platform->queue(), self::cases()); } public function instagramGraphBaseUrl(): string { return match ($this) { self::InstagramFacebook => 'https://graph.facebook.com/v25.0', self::Instagram => 'https://graph.instagram.com/v25.0', default => 'https://graph.instagram.com/v25.0', }; } public function isEnabled(): bool { return config("trypost.platforms.{$this->value}.enabled", true); } /** * Static, platform-specific data exposed to the frontend (e.g. TikTok privacy options, * compliance URLs). Returns an empty array for platforms with no extra config. * * @return array */ public function publishConfig(): array { return match ($this) { self::TikTok => [ 'privacyLevelOptions' => [ 'PUBLIC_TO_EVERYONE', 'MUTUAL_FOLLOW_FRIENDS', 'FOLLOWER_OF_CREATOR', 'SELF_ONLY', ], 'musicUsageConfirmationUrl' => 'https://www.tiktok.com/legal/page/global/music-usage-confirmation/en', 'brandedContentPolicyUrl' => 'https://www.tiktok.com/legal/page/global/bc-policy/en', ], default => [], }; } /** * Get all enabled platforms. * * @return array */ public static function enabled(): array { return array_filter(self::cases(), fn (self $platform) => $platform->isEnabled()); } }