]> git.mxchange.org Git - friendica.git/blob - src/Module/Settings/Display.php
Merge pull request #8319 from MrPetovan/task/8318-dislike-user-setting
[friendica.git] / src / Module / Settings / Display.php
1 <?php
2 /**
3  * @copyright Copyright (C) 2020, Friendica
4  *
5  * @license GNU AGPL version 3 or any later version
6  *
7  * This program is free software: you can redistribute it and/or modify
8  * it under the terms of the GNU Affero General Public License as
9  * published by the Free Software Foundation, either version 3 of the
10  * License, or (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU Affero General Public License for more details.
16  *
17  * You should have received a copy of the GNU Affero General Public License
18  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
19  *
20  */
21
22 namespace Friendica\Module\Settings;
23
24 use Friendica\Core\Hook;
25 use Friendica\Core\Renderer;
26 use Friendica\Core\Session;
27 use Friendica\Core\Theme;
28 use Friendica\Database\DBA;
29 use Friendica\DI;
30 use Friendica\Module\BaseSettings;
31 use Friendica\Network\HTTPException;
32 use Friendica\Util\Strings;
33
34 /**
35  * Module to update user settings
36  */
37 class Display extends BaseSettings
38 {
39         public static function post(array $parameters = [])
40         {
41                 if (!local_user() || !empty(DI::app()->user['uid']) && DI::app()->user['uid'] != local_user()) {
42                         throw new HTTPException\ForbiddenException(DI::l10n()->t('Permission denied.'));
43                 }
44
45                 self::checkFormSecurityTokenRedirectOnError('/settings/display', 'settings_display');
46
47                 $theme              = !empty($_POST['theme'])              ? Strings::escapeTags(trim($_POST['theme']))        : DI::app()->user['theme'];
48                 $mobile_theme       = !empty($_POST['mobile_theme'])       ? Strings::escapeTags(trim($_POST['mobile_theme'])) : '';
49                 $nosmile            = !empty($_POST['nosmile'])            ? intval($_POST['nosmile'])            : 0;
50                 $first_day_of_week  = !empty($_POST['first_day_of_week'])  ? intval($_POST['first_day_of_week'])  : 0;
51                 $infinite_scroll    = !empty($_POST['infinite_scroll'])    ? intval($_POST['infinite_scroll'])    : 0;
52                 $no_auto_update     = !empty($_POST['no_auto_update'])     ? intval($_POST['no_auto_update'])     : 0;
53                 $no_smart_threading = !empty($_POST['no_smart_threading']) ? intval($_POST['no_smart_threading']) : 0;
54                 $hide_dislike       = !empty($_POST['hide_dislike'])       ? intval($_POST['hide_dislike'])       : 0;
55                 $browser_update     = !empty($_POST['browser_update'])     ? intval($_POST['browser_update'])     : 0;
56                 if ($browser_update != -1) {
57                         $browser_update = $browser_update * 1000;
58                         if ($browser_update < 10000) {
59                                 $browser_update = 10000;
60                         }
61                 }
62
63                 $itemspage_network = !empty($_POST['itemspage_network']) ?
64                         intval($_POST['itemspage_network']) :
65                         DI::config()->get('system', 'itemspage_network');
66                 if ($itemspage_network > 100) {
67                         $itemspage_network = 100;
68                 }
69                 $itemspage_mobile_network = !empty($_POST['itemspage_mobile_network']) ?
70                         intval($_POST['itemspage_mobile_network']) :
71                         DI::config()->get('system', 'itemspage_network_mobile');
72                 if ($itemspage_mobile_network > 100) {
73                         $itemspage_mobile_network = 100;
74                 }
75
76                 if ($mobile_theme !== '') {
77                         DI::pConfig()->set(local_user(), 'system', 'mobile_theme', $mobile_theme);
78                 }
79
80                 DI::pConfig()->set(local_user(), 'system', 'itemspage_network'       , $itemspage_network);
81                 DI::pConfig()->set(local_user(), 'system', 'itemspage_mobile_network', $itemspage_mobile_network);
82                 DI::pConfig()->set(local_user(), 'system', 'update_interval'         , $browser_update);
83                 DI::pConfig()->set(local_user(), 'system', 'no_auto_update'          , $no_auto_update);
84                 DI::pConfig()->set(local_user(), 'system', 'no_smilies'              , $nosmile);
85                 DI::pConfig()->set(local_user(), 'system', 'infinite_scroll'         , $infinite_scroll);
86                 DI::pConfig()->set(local_user(), 'system', 'no_smart_threading'      , $no_smart_threading);
87                 DI::pConfig()->set(local_user(), 'system', 'hide_dislike'            , $hide_dislike);
88                 DI::pConfig()->set(local_user(), 'system', 'first_day_of_week'       , $first_day_of_week);
89
90                 if (in_array($theme, Theme::getAllowedList())) {
91                         if ($theme == DI::app()->user['theme']) {
92                                 // call theme_post only if theme has not been changed
93                                 if (($themeconfigfile = Theme::getConfigFile($theme)) !== null) {
94                                         require_once $themeconfigfile;
95                                         theme_post(DI::app());
96                                 }
97                         } else {
98                                 DBA::update('user', ['theme' => $theme], ['uid' => local_user()]);
99                         }
100                 } else {
101                         notice(DI::l10n()->t('The theme you chose isn\'t available.'));
102                 }
103
104                 Hook::callAll('display_settings_post', $_POST);
105
106                 DI::baseUrl()->redirect('settings/display');
107         }
108
109         public static function content(array $parameters = [])
110         {
111                 parent::content($parameters);
112
113                 if (!local_user()) {
114                         throw new HTTPException\ForbiddenException(DI::l10n()->t('Permission denied.'));
115                 }
116
117                 $default_theme = DI::config()->get('system', 'theme');
118                 if (!$default_theme) {
119                         $default_theme = 'default';
120                 }
121
122                 $default_mobile_theme = DI::config()->get('system', 'mobile-theme');
123                 if (!$default_mobile_theme) {
124                         $default_mobile_theme = 'none';
125                 }
126
127                 $allowed_themes = Theme::getAllowedList();
128
129                 $themes = [];
130                 $mobile_themes = ["---" => DI::l10n()->t('No special theme for mobile devices')];
131                 foreach ($allowed_themes as $theme) {
132                         $is_experimental = file_exists('view/theme/' . $theme . '/experimental');
133                         $is_unsupported  = file_exists('view/theme/' . $theme . '/unsupported');
134                         $is_mobile       = file_exists('view/theme/' . $theme . '/mobile');
135                         if (!$is_experimental || (DI::config()->get('experimentals', 'exp_themes') || is_null(DI::config()->get('experimentals', 'exp_themes')))) {
136                                 $theme_name = ucfirst($theme);
137                                 if ($is_unsupported) {
138                                         $theme_name = DI::l10n()->t('%s - (Unsupported)', $theme_name);
139                                 } elseif ($is_experimental) {
140                                         $theme_name = DI::l10n()->t('%s - (Experimental)', $theme_name);
141                                 }
142
143                                 if ($is_mobile) {
144                                         $mobile_themes[$theme] = $theme_name;
145                                 } else {
146                                         $themes[$theme] = $theme_name;
147                                 }
148                         }
149                 }
150
151                 $theme_selected        = DI::app()->user['theme'] ?: $default_theme;
152                 $mobile_theme_selected = Session::get('mobile-theme', $default_mobile_theme);
153
154                 $itemspage_network = intval(DI::pConfig()->get(local_user(), 'system', 'itemspage_network'));
155                 $itemspage_network = (($itemspage_network > 0 && $itemspage_network < 101) ? $itemspage_network : DI::config()->get('system', 'itemspage_network'));
156                 $itemspage_mobile_network = intval(DI::pConfig()->get(local_user(), 'system', 'itemspage_mobile_network'));
157                 $itemspage_mobile_network = (($itemspage_mobile_network > 0 && $itemspage_mobile_network < 101) ? $itemspage_mobile_network : DI::config()->get('system', 'itemspage_network_mobile'));
158
159                 $browser_update = intval(DI::pConfig()->get(local_user(), 'system', 'update_interval'));
160                 if (intval($browser_update) != -1) {
161                         $browser_update = (($browser_update == 0) ? 40 : $browser_update / 1000); // default if not set: 40 seconds
162                 }
163
164                 $no_auto_update     = DI::pConfig()->get(local_user(), 'system', 'no_auto_update', 0);
165                 $nosmile            = DI::pConfig()->get(local_user(), 'system', 'no_smilies', 0);
166                 $infinite_scroll    = DI::pConfig()->get(local_user(), 'system', 'infinite_scroll', 0);
167                 $no_smart_threading = DI::pConfig()->get(local_user(), 'system', 'no_smart_threading', 0);
168                 $hide_dislike       = DI::pConfig()->get(local_user(), 'system', 'hide_dislike', 0);
169
170                 $first_day_of_week = DI::pConfig()->get(local_user(), 'system', 'first_day_of_week', 0);
171                 $weekdays = [0 => DI::l10n()->t("Sunday"), 1 => DI::l10n()->t("Monday")];
172
173                 $theme_config = '';
174                 if ($themeconfigfile = Theme::getConfigFile($theme_selected)) {
175                         require_once $themeconfigfile;
176                         $theme_config = theme_content(DI::app());
177                 }
178
179                 $tpl = Renderer::getMarkupTemplate('settings/display.tpl');
180                 $o = Renderer::replaceMacros($tpl, [
181                         '$ptitle'         => DI::l10n()->t('Display Settings'),
182                         '$submit'         => DI::l10n()->t('Save Settings'),
183                         '$d_tset'         => DI::l10n()->t('General Theme Settings'),
184                         '$d_ctset'        => DI::l10n()->t('Custom Theme Settings'),
185                         '$d_cset'         => DI::l10n()->t('Content Settings'),
186                         '$stitle'         => DI::l10n()->t('Theme settings'),
187                         '$calendar_title' => DI::l10n()->t('Calendar'),
188
189                         '$form_security_token' => self::getFormSecurityToken('settings_display'),
190                         '$baseurl' => DI::baseUrl()->get(true),
191                         '$uid'     => local_user(),
192
193                         '$theme'            => ['theme', DI::l10n()->t('Display Theme:'), $theme_selected, '', $themes, true],
194                         '$mobile_theme' => ['mobile_theme', DI::l10n()->t('Mobile Theme:'), $mobile_theme_selected, '', $mobile_themes, false],
195                         '$theme_config' => $theme_config,
196
197                         '$itemspage_network'        => ['itemspage_network'       , DI::l10n()->t('Number of items to display per page:'), $itemspage_network, DI::l10n()->t('Maximum of 100 items')],
198                         '$itemspage_mobile_network' => ['itemspage_mobile_network', DI::l10n()->t('Number of items to display per page when viewed from mobile device:'), $itemspage_mobile_network, DI::l10n()->t('Maximum of 100 items')],
199                         '$ajaxint'                  => ['browser_update'          , DI::l10n()->t('Update browser every xx seconds'), $browser_update, DI::l10n()->t('Minimum of 10 seconds. Enter -1 to disable it.')],
200                         '$no_auto_update'           => ['no_auto_update'          , DI::l10n()->t('Automatic updates only at the top of the network page'), $no_auto_update, DI::l10n()->t('When disabled, the network page is updated all the time, which could be confusing while reading.')],
201                         '$nosmile'                      => ['nosmile'                 , DI::l10n()->t('Don\'t show emoticons'), $nosmile, DI::l10n()->t('Normally emoticons are replaced with matching symbols. This setting disables this behaviour.')],
202                         '$infinite_scroll'          => ['infinite_scroll'         , DI::l10n()->t('Infinite scroll'), $infinite_scroll, DI::l10n()->t('Automatic fetch new items when reaching the page end.')],
203                         '$no_smart_threading'       => ['no_smart_threading'      , DI::l10n()->t('Disable Smart Threading'), $no_smart_threading, DI::l10n()->t('Disable the automatic suppression of extraneous thread indentation.')],
204                         '$hide_dislike'             => ['hide_dislike'            , DI::l10n()->t('Hide the Dislike feature'), $hide_dislike, DI::l10n()->t('Hides the Dislike button and dislike reactions on posts and comments.')],
205
206                         '$first_day_of_week' => ['first_day_of_week', DI::l10n()->t('Beginning of week:'), $first_day_of_week, '', $weekdays, false],
207                 ]);
208
209                 return $o;
210         }
211 }