diff --git a/app/src/Enum/SocialMediaEnum.php b/app/src/Enum/SocialMediaEnum.php new file mode 100644 index 0000000000..d8d8ef1d30 --- /dev/null +++ b/app/src/Enum/SocialMediaEnum.php @@ -0,0 +1,31 @@ + "/(?:{$this->value}\/(?:profile\.php\?id=)?|^)([\w\d\.]+)$/i", + + self::X, self::YOUTUBE, self::TIKTOK => "/(?:{$this->value}\/|^)(@?[\w\d\.]+)$/i", + + self::LINKEDIN => "/(?:{$this->value}\/in\/|^)([\w\d-]+)$/i", + + self::SPOTIFY => "/(?:open\.)?spotify\.com\/(?:intl-\w+\/)?(?:(user|artist)\/([\w\d]+))|^(user|artist)\/([\w\d]+)$/i", + }; + } +} diff --git a/src/conf/agent-types.php b/src/conf/agent-types.php index 941493836f..aede7bffea 100644 --- a/src/conf/agent-types.php +++ b/src/conf/agent-types.php @@ -1,6 +1,7 @@ "socialMedia", 'label' => \MapasCulturais\i::__('Facebook'), 'serialize' =>function($value){ - return Utils::parseSocialMediaUser('facebook.com', $value); + return Utils::parseSocialMediaUser(SocialMediaEnum::FACEBOOK, $value); }, 'validations' => array( "v::oneOf(v::urlDomain('facebook.com'), v::regex('/^@?([\w\d\.]+)$/i'))" => \MapasCulturais\i::__("O valor deve ser uma URL válida ou o nome ou id do usuário.") ), - 'placeholder' => "nomedousuario ou iddousuario", + 'placeholder' => "Url ou id do usuário", 'available_for_opportunities' => true ), 'twitter' => array( 'type' => "socialMedia", 'label' => \MapasCulturais\i::__('Twitter'), 'serialize' =>function($value){ - return Utils::parseSocialMediaUser('twitter.com', $value); + return Utils::parseSocialMediaUser(SocialMediaEnum::X, $value); }, 'validations' => array( - "v::oneOf(v::urlDomain('twitter.com'), v::regex('/^@?([\w\d\.]+)$/i'))" => \MapasCulturais\i::__("O valor deve ser uma URL ou usuário válido.") + "v::oneOf(v::urlDomain('x.com'), v::regex('/^@?([\w\d\.]+)$/i'))" => \MapasCulturais\i::__("O valor deve ser uma URL ou usuário válido.") ), - 'placeholder' => "nomedousuario", + 'placeholder' => "Url ou id do usuário", + 'available_for_opportunities' => true + ), + 'x' => array( + 'type' => "socialMedia", + 'label' => \MapasCulturais\i::__('X'), + 'serialize' =>function($value){ + return Utils::parseSocialMediaUser(SocialMediaEnum::X, $value); + }, + 'validations' => array( + "v::oneOf(v::urlDomain('x.com'), v::regex('/^@?([\w\d\.]+)$/i'))" => \MapasCulturais\i::__("O valor deve ser uma URL ou usuário válido.") + ), + 'placeholder' => "Url ou id do usuário", 'available_for_opportunities' => true ), 'instagram' => array( @@ -458,23 +471,23 @@ 'label' => \MapasCulturais\i::__('Instagram'), 'available_for_opportunities' => true, 'serialize' =>function($value){ - return Utils::parseSocialMediaUser('instagram.com', $value); + return Utils::parseSocialMediaUser(SocialMediaEnum::INSTAGRAM, $value); }, 'validations' => array( "v::oneOf(v::urlDomain('instagram.com'), v::regex('/^@?([\w\d\.]+)$/i'))" => \MapasCulturais\i::__("O valor deve ser uma URL ou usuário válido.") ), - 'placeholder' => "nomedousuario", + 'placeholder' => "Url ou id do usuário", ), 'linkedin' => array( 'type' => "socialMedia", 'label' => \MapasCulturais\i::__('Linkedin'), 'serialize' =>function($value){ - return Utils::parseSocialMediaUser('linkedin.com', $value); + return Utils::parseSocialMediaUser(SocialMediaEnum::LINKEDIN, $value); }, 'validations' => array( "v::oneOf(v::urlDomain('linkedin.com'), v::regex('/^@?([\w\d\.]+)$/i'))" => \MapasCulturais\i::__("O valor deve ser uma URL ou usuário válido.") ), - 'placeholder' => "nomedousuario", + 'placeholder' => "Url ou id do usuário", 'available_for_opportunities' => true ), 'vimeo' => array( @@ -484,21 +497,21 @@ "v::oneOf(v::urlDomain('vimeo.com'), v::regex('/^@?([\w\d\.]+)$/i'))" => \MapasCulturais\i::__("O valor deve ser uma URL ou usuário válido.") ), 'serialize' =>function($value){ - return Utils::parseSocialMediaUser('vimeo.com', $value); + return Utils::parseSocialMediaUser(SocialMediaEnum::VIMEO, $value); }, - 'placeholder' => "nomedousuario", + 'placeholder' => "Url ou id do usuário", 'available_for_opportunities' => true ), 'spotify' => array( 'type' => "socialMedia", 'label' => \MapasCulturais\i::__('Spotify'), 'validations' => array( - "v::oneOf(v::urlDomain('spotify.com'), v::regex('/^@?([\w\d\.]+)$/i'))" => \MapasCulturais\i::__("O valor deve ser uma URL ou usuário válido.") + "v::oneOf(v::urlDomain('spotify.com'), v::regex('/(?:open\.)?spotify\.com\/(?:intl-\w+\/)?(?:(user|artist)\/([\w\d]+))|^(user|artist)\/([\w\d]+)$/i'))" => \MapasCulturais\i::__("O valor deve ser uma URL ou usuário válido.") ), 'serialize' =>function($value){ - return Utils::parseSocialMediaUser('spotify.com', $value); + return Utils::parseSocialMediaUser(SocialMediaEnum::SPOTIFY, $value); }, - 'placeholder' => "nomedousuario", + 'placeholder' => "Url ou user/id ou artist/id", 'available_for_opportunities' => true ), 'youtube' => array( @@ -508,9 +521,9 @@ "v::oneOf(v::urlDomain('youtube.com'), v::regex('/^@?([\w\d\.]+)$/i'))" => \MapasCulturais\i::__("O valor deve ser uma URL ou usuário válido.") ), 'serialize' =>function($value){ - return Utils::parseSocialMediaUser('youtube.com', $value); + return Utils::parseSocialMediaUser(SocialMediaEnum::YOUTUBE, $value); }, - 'placeholder' => "iddocanal", + 'placeholder' => "Url ou id do canal", 'available_for_opportunities' => true ), 'pinterest' => array( @@ -520,9 +533,21 @@ "v::oneOf(v::urlDomain('pinterest.com'), v::regex('/^@?([\w\d\.]+)$/i'))" => \MapasCulturais\i::__("O valor deve ser uma URL ou usuário válido.") ), 'serialize' =>function($value){ - return Utils::parseSocialMediaUser('pinterest.com', $value); + return Utils::parseSocialMediaUser(SocialMediaEnum::PINTEREST, $value); + }, + 'placeholder' => "Url ou id do usuário", + 'available_for_opportunities' => true + ), + 'tiktok' => array( + 'type' => "socialMedia", + 'label' => \MapasCulturais\i::__('TikTok'), + 'validations' => array( + "v::oneOf(v::urlDomain('tiktok.com'), v::regex('/^@?([\w\d\.]+)$/i'))" => \MapasCulturais\i::__("O valor deve ser uma URL ou usuário válido.") + ), + 'serialize' =>function($value){ + return Utils::parseSocialMediaUser(SocialMediaEnum::TIKTOK, $value); }, - 'placeholder' => "nomedousuario", + 'placeholder' => "Url ou id do usuário", 'available_for_opportunities' => true ), // DADOS BANCÁRIOS diff --git a/src/conf/event-types.php b/src/conf/event-types.php index 6512bfa89b..1a462696d8 100644 --- a/src/conf/event-types.php +++ b/src/conf/event-types.php @@ -1,5 +1,6 @@ "socialMedia", 'label' => \MapasCulturais\i::__('Facebook'), 'serialize' =>function($value){ - return Utils::parseSocialMediaUser('facebook.com', $value); + return Utils::parseSocialMediaUser(SocialMediaEnum::FACEBOOK, $value); }, 'validations' => array( "v::oneOf(v::urlDomain('facebook.com'), v::regex('/^@?([\w\d\.]+)$/i'))" => \MapasCulturais\i::__("O valor deve ser uma URL válida ou o nome ou id do usuário.") ), - 'placeholder' => "nomedousuario", + 'placeholder' => "Url ou id do usuário", 'available_for_opportunities' => true ), 'twitter' => array( 'type' => "socialMedia", 'label' => \MapasCulturais\i::__('Twitter'), 'serialize' =>function($value){ - return Utils::parseSocialMediaUser('twitter.com', $value); + return Utils::parseSocialMediaUser(SocialMediaEnum::X, $value); }, 'validations' => array( - "v::oneOf(v::urlDomain('twitter.com'), v::regex('/^@?([\w\d\.]+)$/i'))" => \MapasCulturais\i::__("O valor deve ser uma URL ou usuário válido.") + "v::oneOf(v::urlDomain('x.com'), v::regex('/^@?([\w\d\.]+)$/i'))" => \MapasCulturais\i::__("O valor deve ser uma URL ou usuário válido.") ), - 'placeholder' => "nomedousuario", + 'placeholder' => "Url ou id do usuário", + 'available_for_opportunities' => true + ), + 'x' => array( + 'type' => "socialMedia", + 'label' => \MapasCulturais\i::__('X'), + 'serialize' =>function($value){ + return Utils::parseSocialMediaUser(SocialMediaEnum::X, $value); + }, + 'validations' => array( + "v::oneOf(v::urlDomain('x.com'), v::regex('/^@?([\w\d\.]+)$/i'))" => \MapasCulturais\i::__("O valor deve ser uma URL ou usuário válido.") + ), + 'placeholder' => "Url ou id do usuário", 'available_for_opportunities' => true ), 'instagram' => array( @@ -97,71 +110,83 @@ 'label' => \MapasCulturais\i::__('Instagram'), 'available_for_opportunities' => true, 'serialize' =>function($value){ - return Utils::parseSocialMediaUser('instagram.com', $value); + return Utils::parseSocialMediaUser(SocialMediaEnum::INSTAGRAM, $value); }, 'validations' => array( "v::oneOf(v::urlDomain('instagram.com'), v::regex('/^@?([\w\d\.]+)$/i'))" => \MapasCulturais\i::__("O valor deve ser uma URL ou usuário válido.") ), - 'placeholder' => "nomedousuario", + 'placeholder' => "Url ou id do usuário", ), 'linkedin' => array( 'type' => "socialMedia", 'label' => \MapasCulturais\i::__('Linkedin'), 'serialize' =>function($value){ - return Utils::parseSocialMediaUser('linkedin.com', $value); + return Utils::parseSocialMediaUser(SocialMediaEnum::LINKEDIN, $value); }, 'validations' => array( "v::oneOf(v::urlDomain('linkedin.com'), v::regex('/^@?([\w\d\.]+)$/i'))" => \MapasCulturais\i::__("O valor deve ser uma URL ou usuário válido.") ), - 'placeholder' => "nomedousuario", + 'placeholder' => "Url ou id do usuário", 'available_for_opportunities' => true ), 'vimeo' => array( - 'type' => "socialMedia", + 'type' => "socialMedia", 'label' => \MapasCulturais\i::__('Vimeo'), 'validations' => array( "v::oneOf(v::urlDomain('vimeo.com'), v::regex('/^@?([\w\d\.]+)$/i'))" => \MapasCulturais\i::__("O valor deve ser uma URL ou usuário válido.") ), 'serialize' =>function($value){ - return Utils::parseSocialMediaUser('vimeo.com', $value); + return Utils::parseSocialMediaUser(SocialMediaEnum::VIMEO, $value); }, - 'placeholder' => "nomedousuario", + 'placeholder' => "Url ou id do usuário", 'available_for_opportunities' => true ), 'spotify' => array( - 'type' => "socialMedia", + 'type' => "socialMedia", 'label' => \MapasCulturais\i::__('Spotify'), 'validations' => array( - "v::oneOf(v::urlDomain('spotify.com'), v::regex('/^@?([\w\d\.]+)$/i'))" => \MapasCulturais\i::__("O valor deve ser uma URL ou usuário válido.") + "v::oneOf(v::urlDomain('spotify.com'), v::regex('/(?:open\.)?spotify\.com\/(?:intl-\w+\/)?(?:(user|artist)\/([\w\d]+))|^(user|artist)\/([\w\d]+)$/i'))" => \MapasCulturais\i::__("O valor deve ser uma URL ou usuário válido.") ), 'serialize' =>function($value){ - return Utils::parseSocialMediaUser('spotify.com', $value); + return Utils::parseSocialMediaUser(SocialMediaEnum::SPOTIFY, $value); }, - 'placeholder' => "nomedousuario", + 'placeholder' => "Url ou user/id ou artist/id", 'available_for_opportunities' => true ), 'youtube' => array( - 'type' => "socialMedia", + 'type' => "socialMedia", 'label' => \MapasCulturais\i::__('YouTube'), 'validations' => array( "v::oneOf(v::urlDomain('youtube.com'), v::regex('/^@?([\w\d\.]+)$/i'))" => \MapasCulturais\i::__("O valor deve ser uma URL ou usuário válido.") ), 'serialize' =>function($value){ - return Utils::parseSocialMediaUser('youtube.com', $value); + return Utils::parseSocialMediaUser(SocialMediaEnum::YOUTUBE, $value); }, - 'placeholder' => "nomedousuario", + 'placeholder' => "Url ou id do canal", 'available_for_opportunities' => true ), 'pinterest' => array( - 'type' => "socialMedia", + 'type' => "socialMedia", 'label' => \MapasCulturais\i::__('Pinterest'), 'validations' => array( "v::oneOf(v::urlDomain('pinterest.com'), v::regex('/^@?([\w\d\.]+)$/i'))" => \MapasCulturais\i::__("O valor deve ser uma URL ou usuário válido.") ), 'serialize' =>function($value){ - return Utils::parseSocialMediaUser('pinterest.com', $value); + return Utils::parseSocialMediaUser(SocialMediaEnum::PINTEREST, $value); + }, + 'placeholder' => "Url ou id do usuário", + 'available_for_opportunities' => true + ), + 'tiktok' => array( + 'type' => "socialMedia", + 'label' => \MapasCulturais\i::__('TikTok'), + 'validations' => array( + "v::oneOf(v::urlDomain('tiktok.com'), v::regex('/^@?([\w\d\.]+)$/i'))" => \MapasCulturais\i::__("O valor deve ser uma URL ou usuário válido.") + ), + 'serialize' =>function($value){ + return Utils::parseSocialMediaUser(SocialMediaEnum::TIKTOK, $value); }, - 'placeholder' => "nomedousuario", + 'placeholder' => "Url ou id do usuário", 'available_for_opportunities' => true ), 'event_attendance' => array( diff --git a/src/conf/opportunity-types.php b/src/conf/opportunity-types.php index 5c00780348..a4ae7b0dfc 100644 --- a/src/conf/opportunity-types.php +++ b/src/conf/opportunity-types.php @@ -1,5 +1,6 @@ "socialMedia", 'label' => \MapasCulturais\i::__('Facebook'), 'serialize' =>function($value){ - return Utils::parseSocialMediaUser('facebook.com', $value); + return Utils::parseSocialMediaUser(SocialMediaEnum::FACEBOOK, $value); }, 'validations' => array( "v::oneOf(v::urlDomain('facebook.com'), v::regex('/^@?([\w\d\.]+)$/i'))" => \MapasCulturais\i::__("O valor deve ser uma URL válida ou o nome ou id do usuário.") ), - 'placeholder' => "nomedousuario ou iddousuario", + 'placeholder' => "Url ou id do usuário", 'available_for_opportunities' => true ), 'twitter' => array( 'type' => "socialMedia", 'label' => \MapasCulturais\i::__('Twitter'), 'serialize' =>function($value){ - return Utils::parseSocialMediaUser('twitter.com', $value); + return Utils::parseSocialMediaUser(SocialMediaEnum::X, $value); }, 'validations' => array( - "v::oneOf(v::urlDomain('twitter.com'), v::regex('/^@?([\w\d\.]+)$/i'))" => \MapasCulturais\i::__("O valor deve ser uma URL ou usuário válido.") + "v::oneOf(v::urlDomain('x.com'), v::regex('/^@?([\w\d\.]+)$/i'))" => \MapasCulturais\i::__("O valor deve ser uma URL ou usuário válido.") ), - 'placeholder' => "nomedousuario", + 'placeholder' => "Url ou id do usuário", + 'available_for_opportunities' => true + ), + 'x' => array( + 'type' => "socialMedia", + 'label' => \MapasCulturais\i::__('X'), + 'serialize' =>function($value){ + return Utils::parseSocialMediaUser(SocialMediaEnum::X, $value); + }, + 'validations' => array( + "v::oneOf(v::urlDomain('x.com'), v::regex('/^@?([\w\d\.]+)$/i'))" => \MapasCulturais\i::__("O valor deve ser uma URL ou usuário válido.") + ), + 'placeholder' => "Url ou id do usuário", 'available_for_opportunities' => true ), 'instagram' => array( @@ -127,23 +140,23 @@ function compareNamesOpportunity ($item1, $item2) { 'label' => \MapasCulturais\i::__('Instagram'), 'available_for_opportunities' => true, 'serialize' =>function($value){ - return Utils::parseSocialMediaUser('instagram.com', $value); + return Utils::parseSocialMediaUser(SocialMediaEnum::INSTAGRAM, $value); }, 'validations' => array( "v::oneOf(v::urlDomain('instagram.com'), v::regex('/^@?([\w\d\.]+)$/i'))" => \MapasCulturais\i::__("O valor deve ser uma URL ou usuário válido.") ), - 'placeholder' => "nomedousuario", + 'placeholder' => "Url ou id do usuário", ), 'linkedin' => array( 'type' => "socialMedia", 'label' => \MapasCulturais\i::__('Linkedin'), 'serialize' =>function($value){ - return Utils::parseSocialMediaUser('linkedin.com', $value); + return Utils::parseSocialMediaUser(SocialMediaEnum::LINKEDIN, $value); }, 'validations' => array( "v::oneOf(v::urlDomain('linkedin.com'), v::regex('/^@?([\w\d\.]+)$/i'))" => \MapasCulturais\i::__("O valor deve ser uma URL ou usuário válido.") ), - 'placeholder' => "nomedousuario", + 'placeholder' => "Url ou id do usuário", 'available_for_opportunities' => true ), 'vimeo' => array( @@ -153,21 +166,21 @@ function compareNamesOpportunity ($item1, $item2) { "v::oneOf(v::urlDomain('vimeo.com'), v::regex('/^@?([\w\d\.]+)$/i'))" => \MapasCulturais\i::__("O valor deve ser uma URL ou usuário válido.") ), 'serialize' =>function($value){ - return Utils::parseSocialMediaUser('vimeo.com', $value); + return Utils::parseSocialMediaUser(SocialMediaEnum::VIMEO, $value); }, - 'placeholder' => "nomedousuario", + 'placeholder' => "Url ou id do usuário", 'available_for_opportunities' => true ), 'spotify' => array( 'type' => "socialMedia", 'label' => \MapasCulturais\i::__('Spotify'), 'validations' => array( - "v::oneOf(v::urlDomain('spotify.com'), v::regex('/^@?([\w\d\.]+)$/i'))" => \MapasCulturais\i::__("O valor deve ser uma URL ou usuário válido.") + "v::oneOf(v::urlDomain('spotify.com'), v::regex('/(?:open\.)?spotify\.com\/(?:intl-\w+\/)?(?:(user|artist)\/([\w\d]+))|^(user|artist)\/([\w\d]+)$/i'))" => \MapasCulturais\i::__("O valor deve ser uma URL ou usuário válido.") ), 'serialize' =>function($value){ - return Utils::parseSocialMediaUser('spotify.com', $value); + return Utils::parseSocialMediaUser(SocialMediaEnum::SPOTIFY, $value); }, - 'placeholder' => "nomedousuario", + 'placeholder' => "Url ou user/id ou artist/id", 'available_for_opportunities' => true ), 'youtube' => array( @@ -177,9 +190,9 @@ function compareNamesOpportunity ($item1, $item2) { "v::oneOf(v::urlDomain('youtube.com'), v::regex('/^@?([\w\d\.]+)$/i'))" => \MapasCulturais\i::__("O valor deve ser uma URL ou usuário válido.") ), 'serialize' =>function($value){ - return Utils::parseSocialMediaUser('youtube.com', $value); + return Utils::parseSocialMediaUser(SocialMediaEnum::YOUTUBE, $value); }, - 'placeholder' => "iddocanal", + 'placeholder' => "Url ou id do canal", 'available_for_opportunities' => true ), 'pinterest' => array( @@ -189,9 +202,21 @@ function compareNamesOpportunity ($item1, $item2) { "v::oneOf(v::urlDomain('pinterest.com'), v::regex('/^@?([\w\d\.]+)$/i'))" => \MapasCulturais\i::__("O valor deve ser uma URL ou usuário válido.") ), 'serialize' =>function($value){ - return Utils::parseSocialMediaUser('pinterest.com', $value); + return Utils::parseSocialMediaUser(SocialMediaEnum::PINTEREST, $value); + }, + 'placeholder' => "Url ou id do usuário", + 'available_for_opportunities' => true + ), + 'tiktok' => array( + 'type' => "socialMedia", + 'label' => \MapasCulturais\i::__('TikTok'), + 'validations' => array( + "v::oneOf(v::urlDomain('tiktok.com'), v::regex('/^@?([\w\d\.]+)$/i'))" => \MapasCulturais\i::__("O valor deve ser uma URL ou usuário válido.") + ), + 'serialize' =>function($value){ + return Utils::parseSocialMediaUser(SocialMediaEnum::TIKTOK, $value); }, - 'placeholder' => "nomedousuario", + 'placeholder' => "Url ou id do usuário", 'available_for_opportunities' => true ), 'registrationSeals' => array( diff --git a/src/conf/project-types.php b/src/conf/project-types.php index e977b53270..74d53d64ab 100644 --- a/src/conf/project-types.php +++ b/src/conf/project-types.php @@ -1,6 +1,7 @@ "socialMedia", 'label' => \MapasCulturais\i::__('Facebook'), 'serialize' =>function($value){ - return Utils::parseSocialMediaUser('facebook.com', $value); + return Utils::parseSocialMediaUser(SocialMediaEnum::FACEBOOK, $value); }, 'validations' => array( "v::oneOf(v::urlDomain('facebook.com'), v::regex('/^@?([\w\d\.]+)$/i'))" => \MapasCulturais\i::__("O valor deve ser uma URL válida ou o nome ou id do usuário.") ), - 'placeholder' => "nomedousuario ou iddousuario", + 'placeholder' => "Url ou id do usuário", 'available_for_opportunities' => true ), 'twitter' => array( 'type' => "socialMedia", 'label' => \MapasCulturais\i::__('Twitter'), 'serialize' =>function($value){ - return Utils::parseSocialMediaUser('twitter.com', $value); + return Utils::parseSocialMediaUser(SocialMediaEnum::X, $value); }, 'validations' => array( - "v::oneOf(v::urlDomain('twitter.com'), v::regex('/^@?([\w\d\.]+)$/i'))" => \MapasCulturais\i::__("O valor deve ser uma URL ou usuário válido.") + "v::oneOf(v::urlDomain('x.com'), v::regex('/^@?([\w\d\.]+)$/i'))" => \MapasCulturais\i::__("O valor deve ser uma URL ou usuário válido.") ), - 'placeholder' => "nomedousuario", + 'placeholder' => "Url ou id do usuário", + 'available_for_opportunities' => true + ), + 'x' => array( + 'type' => "socialMedia", + 'label' => \MapasCulturais\i::__('X'), + 'serialize' =>function($value){ + return Utils::parseSocialMediaUser(SocialMediaEnum::X, $value); + }, + 'validations' => array( + "v::oneOf(v::urlDomain('x.com'), v::regex('/^@?([\w\d\.]+)$/i'))" => \MapasCulturais\i::__("O valor deve ser uma URL ou usuário válido.") + ), + 'placeholder' => "Url ou id do usuário", 'available_for_opportunities' => true ), 'instagram' => array( @@ -90,23 +103,23 @@ function compareNamesProject($a, $b){ 'label' => \MapasCulturais\i::__('Instagram'), 'available_for_opportunities' => true, 'serialize' =>function($value){ - return Utils::parseSocialMediaUser('instagram.com', $value); + return Utils::parseSocialMediaUser(SocialMediaEnum::INSTAGRAM, $value); }, 'validations' => array( "v::oneOf(v::urlDomain('instagram.com'), v::regex('/^@?([\w\d\.]+)$/i'))" => \MapasCulturais\i::__("O valor deve ser uma URL ou usuário válido.") ), - 'placeholder' => "nomedousuario", + 'placeholder' => "Url ou id do usuário", ), 'linkedin' => array( 'type' => "socialMedia", 'label' => \MapasCulturais\i::__('Linkedin'), 'serialize' =>function($value){ - return Utils::parseSocialMediaUser('linkedin.com', $value); + return Utils::parseSocialMediaUser(SocialMediaEnum::LINKEDIN, $value); }, 'validations' => array( "v::oneOf(v::urlDomain('linkedin.com'), v::regex('/^@?([\w\d\.]+)$/i'))" => \MapasCulturais\i::__("O valor deve ser uma URL ou usuário válido.") ), - 'placeholder' => "nomedousuario", + 'placeholder' => "Url ou id do usuário", 'available_for_opportunities' => true ), 'vimeo' => array( @@ -116,21 +129,21 @@ function compareNamesProject($a, $b){ "v::oneOf(v::urlDomain('vimeo.com'), v::regex('/^@?([\w\d\.]+)$/i'))" => \MapasCulturais\i::__("O valor deve ser uma URL ou usuário válido.") ), 'serialize' =>function($value){ - return Utils::parseSocialMediaUser('vimeo.com', $value); + return Utils::parseSocialMediaUser(SocialMediaEnum::VIMEO, $value); }, - 'placeholder' => "nomedousuario", + 'placeholder' => "Url ou id do usuário", 'available_for_opportunities' => true ), 'spotify' => array( 'type' => "socialMedia", 'label' => \MapasCulturais\i::__('Spotify'), 'validations' => array( - "v::oneOf(v::urlDomain('spotify.com'), v::regex('/^@?([\w\d\.]+)$/i'))" => \MapasCulturais\i::__("O valor deve ser uma URL ou usuário válido.") + "v::oneOf(v::urlDomain('spotify.com'), v::regex('/(?:open\.)?spotify\.com\/(?:intl-\w+\/)?(?:(user|artist)\/([\w\d]+))|^(user|artist)\/([\w\d]+)$/i'))" => \MapasCulturais\i::__("O valor deve ser uma URL ou usuário válido.") ), 'serialize' =>function($value){ - return Utils::parseSocialMediaUser('spotify.com', $value); + return Utils::parseSocialMediaUser(SocialMediaEnum::SPOTIFY, $value); }, - 'placeholder' => "nomedousuario", + 'placeholder' => "Url ou user/id ou artist/id", 'available_for_opportunities' => true ), 'youtube' => array( @@ -140,9 +153,9 @@ function compareNamesProject($a, $b){ "v::oneOf(v::urlDomain('youtube.com'), v::regex('/^@?([\w\d\.]+)$/i'))" => \MapasCulturais\i::__("O valor deve ser uma URL ou usuário válido.") ), 'serialize' =>function($value){ - return Utils::parseSocialMediaUser('youtube.com', $value); + return Utils::parseSocialMediaUser(SocialMediaEnum::YOUTUBE, $value); }, - 'placeholder' => "iddocanal", + 'placeholder' => "Url ou id do canal", 'available_for_opportunities' => true ), 'pinterest' => array( @@ -152,9 +165,21 @@ function compareNamesProject($a, $b){ "v::oneOf(v::urlDomain('pinterest.com'), v::regex('/^@?([\w\d\.]+)$/i'))" => \MapasCulturais\i::__("O valor deve ser uma URL ou usuário válido.") ), 'serialize' =>function($value){ - return Utils::parseSocialMediaUser('pinterest.com', $value); + return Utils::parseSocialMediaUser(SocialMediaEnum::PINTEREST, $value); + }, + 'placeholder' => "Url ou id do usuário", + 'available_for_opportunities' => true + ), + 'tiktok' => array( + 'type' => "socialMedia", + 'label' => \MapasCulturais\i::__('TikTok'), + 'validations' => array( + "v::oneOf(v::urlDomain('tiktok.com'), v::regex('/^@?([\w\d\.]+)$/i'))" => \MapasCulturais\i::__("O valor deve ser uma URL ou usuário válido.") + ), + 'serialize' =>function($value){ + return Utils::parseSocialMediaUser(SocialMediaEnum::TIKTOK, $value); }, - 'placeholder' => "nomedousuario", + 'placeholder' => "Url ou id do usuário", 'available_for_opportunities' => true ), diff --git a/src/conf/space-types.php b/src/conf/space-types.php index df2d476a86..2f81cf0e34 100644 --- a/src/conf/space-types.php +++ b/src/conf/space-types.php @@ -1,5 +1,6 @@ "socialMedia", 'label' => \MapasCulturais\i::__('Facebook'), 'serialize' =>function($value){ - return Utils::parseSocialMediaUser('facebook.com', $value); + return Utils::parseSocialMediaUser(SocialMediaEnum::FACEBOOK, $value); }, 'validations' => array( "v::oneOf(v::urlDomain('facebook.com'), v::regex('/^@?([\w\d\.]+)$/i'))" => \MapasCulturais\i::__("O valor deve ser uma URL válida ou o nome ou id do usuário.") ), - 'placeholder' => "nomedousuario ou iddousuario", + 'placeholder' => "Url ou id do usuário", 'available_for_opportunities' => true ), 'twitter' => array( 'type' => "socialMedia", 'label' => \MapasCulturais\i::__('Twitter'), 'serialize' =>function($value){ - return Utils::parseSocialMediaUser('twitter.com', $value); + return Utils::parseSocialMediaUser(SocialMediaEnum::X, $value); }, 'validations' => array( - "v::oneOf(v::urlDomain('twitter.com'), v::regex('/^@?([\w\d\.]+)$/i'))" => \MapasCulturais\i::__("O valor deve ser uma URL ou usuário válido.") + "v::oneOf(v::urlDomain('x.com'), v::regex('/^@?([\w\d\.]+)$/i'))" => \MapasCulturais\i::__("O valor deve ser uma URL ou usuário válido.") ), - 'placeholder' => "nomedousuario", + 'placeholder' => "Url ou id do usuário", + 'available_for_opportunities' => true + ), + 'x' => array( + 'type' => "socialMedia", + 'label' => \MapasCulturais\i::__('X'), + 'serialize' =>function($value){ + return Utils::parseSocialMediaUser(SocialMediaEnum::X, $value); + }, + 'validations' => array( + "v::oneOf(v::urlDomain('x.com'), v::regex('/^@?([\w\d\.]+)$/i'))" => \MapasCulturais\i::__("O valor deve ser uma URL ou usuário válido.") + ), + 'placeholder' => "Url ou id do usuário", 'available_for_opportunities' => true ), 'instagram' => array( @@ -466,23 +479,23 @@ function ordenaSubcategorias(&$array) { 'label' => \MapasCulturais\i::__('Instagram'), 'available_for_opportunities' => true, 'serialize' =>function($value){ - return Utils::parseSocialMediaUser('instagram.com', $value); + return Utils::parseSocialMediaUser(SocialMediaEnum::INSTAGRAM, $value); }, 'validations' => array( "v::oneOf(v::urlDomain('instagram.com'), v::regex('/^@?([\w\d\.]+)$/i'))" => \MapasCulturais\i::__("O valor deve ser uma URL ou usuário válido.") ), - 'placeholder' => "nomedousuario", + 'placeholder' => "Url ou id do usuário", ), 'linkedin' => array( 'type' => "socialMedia", 'label' => \MapasCulturais\i::__('Linkedin'), 'serialize' =>function($value){ - return Utils::parseSocialMediaUser('linkedin.com', $value); + return Utils::parseSocialMediaUser(SocialMediaEnum::LINKEDIN, $value); }, 'validations' => array( "v::oneOf(v::urlDomain('linkedin.com'), v::regex('/^@?([\w\d\.]+)$/i'))" => \MapasCulturais\i::__("O valor deve ser uma URL ou usuário válido.") ), - 'placeholder' => "nomedousuario", + 'placeholder' => "Url ou id do usuário", 'available_for_opportunities' => true ), 'vimeo' => array( @@ -492,21 +505,21 @@ function ordenaSubcategorias(&$array) { "v::oneOf(v::urlDomain('vimeo.com'), v::regex('/^@?([\w\d\.]+)$/i'))" => \MapasCulturais\i::__("O valor deve ser uma URL ou usuário válido.") ), 'serialize' =>function($value){ - return Utils::parseSocialMediaUser('vimeo.com', $value); + return Utils::parseSocialMediaUser(SocialMediaEnum::VIMEO, $value); }, - 'placeholder' => "nomedousuario", + 'placeholder' => "Url ou id do usuário", 'available_for_opportunities' => true ), 'spotify' => array( 'type' => "socialMedia", 'label' => \MapasCulturais\i::__('Spotify'), 'validations' => array( - "v::oneOf(v::urlDomain('spotify.com'), v::regex('/^@?([\w\d\.]+)$/i'))" => \MapasCulturais\i::__("O valor deve ser uma URL ou usuário válido.") + "v::oneOf(v::urlDomain('spotify.com'), v::regex('/(?:open\.)?spotify\.com\/(?:intl-\w+\/)?(?:(user|artist)\/([\w\d]+))|^(user|artist)\/([\w\d]+)$/i'))" => \MapasCulturais\i::__("O valor deve ser uma URL ou usuário válido.") ), 'serialize' =>function($value){ - return Utils::parseSocialMediaUser('spotify.com', $value); + return Utils::parseSocialMediaUser(SocialMediaEnum::SPOTIFY, $value); }, - 'placeholder' => "nomedousuario", + 'placeholder' => "Url ou user/id ou artist/id", 'available_for_opportunities' => true ), 'youtube' => array( @@ -516,9 +529,9 @@ function ordenaSubcategorias(&$array) { "v::oneOf(v::urlDomain('youtube.com'), v::regex('/^@?([\w\d\.]+)$/i'))" => \MapasCulturais\i::__("O valor deve ser uma URL ou usuário válido.") ), 'serialize' =>function($value){ - return Utils::parseSocialMediaUser('youtube.com', $value); + return Utils::parseSocialMediaUser(SocialMediaEnum::YOUTUBE, $value); }, - 'placeholder' => "iddocanal", + 'placeholder' => "Url ou id do canal", 'available_for_opportunities' => true ), 'pinterest' => array( @@ -528,9 +541,21 @@ function ordenaSubcategorias(&$array) { "v::oneOf(v::urlDomain('pinterest.com'), v::regex('/^@?([\w\d\.]+)$/i'))" => \MapasCulturais\i::__("O valor deve ser uma URL ou usuário válido.") ), 'serialize' =>function($value){ - return Utils::parseSocialMediaUser('pinterest.com', $value); + return Utils::parseSocialMediaUser(SocialMediaEnum::PINTEREST, $value); + }, + 'placeholder' => "Url ou id do usuário", + 'available_for_opportunities' => true + ), + 'tiktok' => array( + 'type' => "socialMedia", + 'label' => \MapasCulturais\i::__('TikTok'), + 'validations' => array( + "v::oneOf(v::urlDomain('tiktok.com'), v::regex('/^@?([\w\d\.]+)$/i'))" => \MapasCulturais\i::__("O valor deve ser uma URL ou usuário válido.") + ), + 'serialize' =>function($value){ + return Utils::parseSocialMediaUser(SocialMediaEnum::TIKTOK, $value); }, - 'placeholder' => "nomedousuario", + 'placeholder' => "Url ou id do usuário", 'available_for_opportunities' => true ), diff --git a/src/core/Utils.php b/src/core/Utils.php index e1387c21be..7aefae4cfd 100644 --- a/src/core/Utils.php +++ b/src/core/Utils.php @@ -2,6 +2,8 @@ namespace MapasCulturais; +use App\Enum\SocialMediaEnum; + class Utils { static function removeAccents($string) { if (!preg_match('/[\x80-\xff]/', $string)) @@ -181,24 +183,33 @@ static function formatCnpjCpf($value) { * * @return string|null */ - static function parseSocialMediaUser(string $domain, ?string $value) : string|null { - $result = null; - - if($value){ - - $domain = preg_quote($domain); - - $_value = trim($value); - $_value = preg_replace("~^(?:https?:\/\/)?(?:www\.)?~i", "", $_value); - $_value = rtrim($_value, '/'); - - if (preg_match("/(?:{$domain})\/(profile\.php\?id=)?([\w\d\.]+)/i", $_value, $matches)) { - $result = $matches[2]; - } else if(preg_match("/^@?([\w\d\.]+)$/i", $_value, $matches)){ - $result = $matches[1]; - } + static function parseSocialMediaUser(SocialMediaEnum $domain, ?string $value) : string|null + { + if (true === empty($value)) { + return null; + } + + $domainRegex = $domain->getParsingRegex(); + + $_value = trim($value); + $_value = preg_replace("~^(?:https?:\/\/)?(?:www\.)?~i", "", $_value); + $_value = rtrim($_value, '/'); + + if (false === preg_match($domainRegex, $_value, $matches)) { + return null; } - return $result; + return match ($domain) { + SocialMediaEnum::SPOTIFY => self::formatSpotifyUser($matches), + default => end($matches), + }; + } + + private static function formatSpotifyUser(array $matches): string + { + $type = empty($matches[1]) ? $matches[3] : $matches[1]; + $id = empty($matches[2]) ? $matches[4] : $matches[2]; + + return "$type/$id"; } } diff --git a/src/modules/Components/assets/js/components-base/Utils.js b/src/modules/Components/assets/js/components-base/Utils.js index 9d2fb824b3..8bdda52f6b 100644 --- a/src/modules/Components/assets/js/components-base/Utils.js +++ b/src/modules/Components/assets/js/components-base/Utils.js @@ -256,6 +256,17 @@ globalThis.Utils = { }, buildSocialMediaLink(entity, socialMedia){ - return "https://" + socialMedia + ".com/" + entity[socialMedia]; + let baseUrl = "https://" + socialMedia + ".com/"; + + switch (socialMedia) { + case 'linkedin': + baseUrl = "https://www.linkedin.com/in/"; + break; + case 'spotify': + baseUrl = `https://open.spotify.com/`; + break; + } + + return baseUrl + entity[socialMedia]; } } \ No newline at end of file diff --git a/src/modules/Components/components/mc-icon/init.php b/src/modules/Components/components/mc-icon/init.php index 1b55c40e51..ee7aea9bd4 100644 --- a/src/modules/Components/components/mc-icon/init.php +++ b/src/modules/Components/components/mc-icon/init.php @@ -21,10 +21,11 @@ 'pinterest' => 'fa6-brands:pinterest-p', 'spotify' => 'akar-icons:spotify-fill', 'telegram' => 'cib:telegram-plane', - 'twitter' => 'akar-icons:twitter-fill', + 'x' => 'fa6-brands:x-twitter', 'whatsapp' => 'akar-icons:whatsapp-fill', 'vimeo' => 'brandico:vimeo', 'youtube' => 'akar-icons:youtube-fill', + 'tiktok' => 'bxl:tiktok', // IMPORTANTE: manter ordem alfabética diff --git a/src/modules/Components/components/mc-share-links/template.php b/src/modules/Components/components/mc-share-links/template.php index f28f3a1286..18fa038bec 100644 --- a/src/modules/Components/components/mc-share-links/template.php +++ b/src/modules/Components/components/mc-share-links/template.php @@ -12,8 +12,8 @@ - - + + -->