<?php
namespace XF\ChangeLog;
use XF\Mvc\Entity\Entity;
use XF\Util\Arr;
use function is_array;
class User extends AbstractHandler
{
protected $groupMap;
/**
* @var \XF\Entity\UserField[]
*/
protected $customFields;
protected function getLabelMap()
{
return [
'username' => 'user_name',
'email' => 'email_address',
'timezone' => 'time_zone',
'visible' => 'show_online_status',
'activity_visible' => 'show_current_activity',
'user_group_id' => 'user_group',
'secondary_group_ids' => 'secondary_user_groups',
'register_date' => 'joined',
'is_moderator' => 'moderator',
'is_admin' => 'administrator',
'is_staff' => 'staff_member',
'is_banned' => 'banned',
'use_tfa' => 'two_step_verification_enabled',
'privacy_policy_accepted' => 'accepted_privacy_policy',
'terms_accepted' => 'accepted_terms_rules',
'show_dob_year' => 'show_year_of_birth',
'show_dob_date' => 'show_day_and_month_of_birth',
'content_show_signature' => 'show_signatures_with_messages',
'receive_admin_email' => 'receive_site_mailings',
'enable_activity_summary_email' => 'receive_summary_activity_email',
'email_on_conversation' => 'email_conversation_notifications',
'push_on_conversation' => 'push_conversation_notifications',
'is_discouraged' => 'discouraged',
'creation_watch_state' => 'watch_content_on_creation',
'interaction_watch_state' => 'watch_content_on_interaction',
'allow_view_profile' => 'view_your_details_on_your_profile_page',
'allow_post_profile' => 'post_messages_on_your_profile_page',
'allow_send_personal_conversation' => 'start_conversations_with_you',
'allow_view_identities' => 'view_your_identities',
'allow_receive_news_feed' => 'receive_your_news_feed',
'data' => 'password', // for historical reasons
];
}
protected function getFormatterMap()
{
return [
'user_group_id' => 'formatUserGroup',
'secondary_group_ids' => 'formatUserGroupList',
'timezone' => 'formatTimeZone',
'visible' => 'formatYesNo',
'activity_visible' => 'formatYesNo',
'avatar_date' => 'formatDateTime',
'banner_date' => 'formatDateTime',
'register_date' => 'formatDateTime',
'user_state' => 'formatUserState',
'security_lock' => 'formatSecurityLock',
'is_moderator' => 'formatYesNo',
'is_admin' => 'formatYesNo',
'is_staff' => 'formatYesNo',
'is_banned' => 'formatYesNo',
'use_tfa' => 'formatYesNo',
'privacy_policy_accepted' => 'formatDateTime',
'terms_accepted' => 'formatDateTime',
'show_dob_year' => 'formatYesNo',
'show_dob_date' => 'formatYesNo',
'content_show_signature' => 'formatYesNo',
'receive_admin_email' => 'formatYesNo',
'enable_activity_summary_email' => 'formatYesNo',
'email_on_conversation' => 'formatYesNo',
'push_on_conversation' => 'formatYesNo',
'is_discouraged' => 'formatYesNo',
'creation_watch_state' => 'formatWatchState',
'interaction_watch_state' => 'formatWatchState',
'allow_view_profile' => 'formatPrivacyValue',
'allow_post_profile' => 'formatPrivacyValue',
'allow_send_personal_conversation' => 'formatPrivacyValue',
'allow_view_identities' => 'formatPrivacyValue',
'allow_receive_news_feed' => 'formatPrivacyValue',
];
}
protected function getProtectedFields()
{
return [
'username' => true,
'privacy_policy_accepted' => true,
'terms_accepted' => true,
'receive_admin_email' => true,
];
}
protected function getPrefixHandlers()
{
return [
'custom_fields' => ['labelCustomField', 'formatCustomField']
];
}
public function getDefaultEditUserId(Entity $entity)
{
$userId = \XF::visitor()->user_id;
if (!$userId && isset($entity->user_id))
{
// guest edits should be treated as self edits; these are mostly system level edits
$userId = $entity->user_id;
}
return $userId;
}
protected function formatUserGroup($userGroupId)
{
if (!is_array($this->groupMap))
{
/** @var \XF\Repository\UserGroup $groupRepo */
$groupRepo = \XF::repository('XF:UserGroup');
$this->groupMap = $groupRepo->getUserGroupTitlePairs();
}
return $this->groupMap[$userGroupId] ?? $userGroupId;
}
protected function formatUserGroupList($userGroupIds)
{
$values = [];
$ids = Arr::stringToArray($userGroupIds, '/,/');
foreach ($ids AS $id)
{
$values[] = $this->formatUserGroup($id);
}
return implode(', ', $values);
}
protected function formatTimeZone($value)
{
/** @var \XF\Data\TimeZone $tzData */
$tzData = \XF::app()->data('XF:TimeZone');
$tzs = $tzData->getTimeZoneData();
return isset($tzs[$value]) ? \XF::phrase($tzs[$value]['phrase']) : $value;
}
protected function formatUserState($value)
{
switch ($value)
{
case 'valid': return \XF::phrase('valid');
case 'email_confirm': return \XF::phrase('awaiting_email_confirmation');
case 'email_confirm_edit': return \XF::phrase('awaiting_email_confirmation_from_edit');
case 'email_bounce': return \XF::phrase('email_invalid_bounced');
case 'moderated': return \XF::phrase('awaiting_approval');
case 'rejected': return \XF::phrase('rejected');
case 'disabled': return \XF::phrase('disabled');
default: return $value;
}
}
protected function formatSecurityLock($value)
{
switch ($value)
{
case 'change': return \XF::phrase('user_must_change_password');
case 'reset': return \XF::phrase('user_must_reset_password');
default: return $value;
}
}
protected function formatWatchState($value)
{
switch ($value)
{
case 'watch_no_email': return \XF::phrase('yes');
case 'watch_email': return \XF::phrase('yes_with_email');
case '': return \XF::phrase('no');
default: return $value;
}
}
protected function formatPrivacyValue($value)
{
switch ($value)
{
case 'everyone': return \XF::phrase('all_visitors');
case 'members': return \XF::phrase('members_only');
case 'followed': return \XF::phrase('followed_members_only');
case 'none': return \XF::phrase('nobody');
default: return $value;
}
}
protected function labelCustomField($field)
{
return $this->labelCustomFieldGeneric('XF:UserField', $field);
}
protected function formatCustomField($field, $value)
{
return $this->formatCustomFieldGeneric('XF:UserField', $field, $value);
}
}