PluginProbe
Timetics – Appointment Booking Calendar & Scheduling / 1.0.49
Timetics – Appointment Booking Calendar & Scheduling v1.0.49
1.0.61 1.0.60 1.0.59 1.0.58 1.0.57 1.0.56 trunk 1.0.0 1.0.1 1.0.10 1.0.11 1.0.12 1.0.13 1.0.14 1.0.15 1.0.16 1.0.17 1.0.18 1.0.19 1.0.2 1.0.20 1.0.21 1.0.22 1.0.23 1.0.24 All 62 releases
timetics / bootstrap.php

bootstrap.php in Timetics – Appointment Booking Calendar & Scheduling 1.0.49, at bootstrap.php

507 lines 16.3 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Bootstrap Class
4 *
5 * @package Timetics
6 */
7 namespace Timetics;
8
9 defined( 'ABSPATH' ) || exit;
10
11 /**
12 * Bootstrap class.
13 *
14 * @since 1.0.0
15 */
16 final class Bootstrap {
17 /**
18 * @var Bootstrap The Actual Timetics instance
19 * @since 1.0.0
20 */
21 private static $instance;
22
23
24 private $file;
25 public $version;
26 private $has_pro;
27
28 /**
29 * Throw Error While Trying To Clone Object
30 *
31 * @since 1.0.0
32 * @return void
33 */
34 public function __clone() {
35 _doing_it_wrong( __FUNCTION__, esc_html__( 'Cloning is forbidden.', 'timetics' ), '1.0.0' );
36 }
37
38 /**
39 * Disabling Un-serialization Of This Class
40 */
41 public function __wakeup() {
42 _doing_it_wrong( __FUNCTION__, esc_html__( 'Unserializing instances of this class is forbidden.', 'timetics' ), '1.0.0' );
43 }
44
45 /**
46 * The actual TimeTics instance
47 *
48 * @since 1.0.0
49 * @param string $file
50 * @return void
51 */
52 public static function instantiate( $file = '' ) {
53
54 // Return if already instantiated
55 if ( self::instantiated() ) {
56 return self::$instance;
57 }
58
59 self::prepare_instance( $file );
60
61 self::$instance->initialize_constants();
62 self::$instance->define_tables();
63 self::$instance->include_files();
64 self::$instance->initialize_components();
65
66 return self::$instance;
67 }
68
69 /**
70 * Return If The Main Class has Already Been Instantiated Or Not
71 *
72 * @since 1.0.0
73 * @return boolean
74 */
75 private static function instantiated() {
76 if ( ( null !== self::$instance ) && ( self::$instance instanceof Bootstrap ) ) {
77 return true;
78 }
79
80 return false;
81 }
82
83 /**
84 * Prepare Singleton Instance
85 *
86 * @since 1.0.0
87 * @param string $file
88 * @return void
89 */
90 private static function prepare_instance( $file = '' ) {
91 self::$instance = new self();
92 self::$instance->file = $file;
93 self::$instance->version = \Timetics::get_version();
94 }
95
96 /**
97 * Assets Directory URL
98 *
99 * @since 1.0.0
100 * @return void
101 */
102 public function get_assets_url() {
103 return trailingslashit( TIMETICS_PLUGIN_URL . 'assets' );
104 }
105
106 /**
107 * Assets Directory Path
108 *
109 * @since 1.0.0
110 * @return void
111 */
112 public function get_assets_dir() {
113 return trailingslashit( TIMETICS_PLUGIN_DIR . 'assets' );
114 }
115
116 /**
117 * Plugin Directory URL
118 *
119 * @return void
120 */
121 public function get_plugin_url() {
122 return trailingslashit( plugin_dir_url( TIMETICS_PLUGIN_FILE ) );
123 }
124
125 /**
126 * Plugin Directory Path
127 *
128 * @return void
129 */
130 public function get_plugin_dir() {
131 return \Timetics::get_plugin_dir();
132 }
133
134 /**
135 * Plugin Basename
136 *
137 * @return void
138 */
139 public function get_plugin_basename() {
140 return plugin_basename( TIMETICS_PLUGIN_FILE );
141 }
142
143 /**
144 * Setup Plugin Constants
145 *
146 * @since 1.0.0
147 * @return void
148 */
149 private function initialize_constants() {
150 // Plugin Version
151 self::$instance->define( 'TIMETICS_VERSION', \Timetics::get_version() );
152
153 // Plugin Main File
154 self::$instance->define( 'TIMETICS_PLUGIN_FILE', $this->file );
155
156 // Plugin File Basename
157 self::$instance->define( 'TIMETICS_PLUGIN_BASE', $this->get_plugin_basename() );
158
159 // Plugin Main Directory Path
160 self::$instance->define( 'TIMETICS_PLUGIN_DIR', $this->get_plugin_dir() );
161
162 // Plugin Main Directory URL
163 self::$instance->define( 'TIMETICS_PLUGIN_URL', $this->get_plugin_url() );
164
165 // Plugin Assets Directory URL
166 self::$instance->define( 'TIMETICS_ASSETS_URL', $this->get_assets_url() );
167
168 // Plugin Assets Directory Path
169 self::$instance->define( 'TIMETICS_ASSETS_DIR', $this->get_assets_dir() );
170
171
172 }
173
174 /**
175 * Define constant if not already set.
176 *
177 * @since 1.0.0
178 * @param string $name Constant name.
179 * @param string|bool $value Constant value.
180 */
181 private function define( $name, $value ) {
182 if ( ! defined( $name ) ) {
183 define( $name, $value );
184 }
185 }
186
187 /**
188 * Define DB Tables Required For This Plugin
189 *
190 * @since 1.0.0
191 * @return void
192 */
193 private function define_tables() {
194 // To Be Implemented
195 }
196
197 /**
198 * Include All Required Files
199 *
200 * @since 1.0.0
201 * @return void
202 */
203 private function include_files() {
204 // require_once TIMETICS_PLUGIN_DIR . 'includes/post-types.php';
205 // require_once TIMETICS_PLUGIN_DIR . 'includes/widgets/manifest.php';
206 // require_once TIMETICS_PLUGIN_DIR . 'includes/template-functions.php';
207 // require_once TIMETICS_PLUGIN_DIR . 'includes/shortcodes.php';
208 // require_once TIMETICS_PLUGIN_DIR . 'includes/install.php';
209
210 /**
211 * Core helpers.
212 */
213 require_once TIMETICS_PLUGIN_DIR . 'utils/global-helper.php';
214 require_once TIMETICS_PLUGIN_DIR . 'core/staffs/calendars/CalendarSyncFacade.php';
215 require_once TIMETICS_PLUGIN_DIR . 'core/staffs/calendars/CalendarSyncFactory.php';
216 require_once TIMETICS_PLUGIN_DIR . 'core/staffs/calendars/CalendarSyncInterface.php';
217 require_once TIMETICS_PLUGIN_DIR . 'core/staffs/calendars/GoogleCalendarSync.php';
218 }
219
220 /**
221 * Initialize All Components
222 *
223 * @since 1.0.0
224 * @return void
225 */
226 private function initialize_components() {
227
228 // Register scripts and styles first
229 if ( $this->is_request( 'admin' ) ) {
230 add_action( 'admin_enqueue_scripts', [ $this, 'admin_scripts' ] );
231 add_action( 'admin_footer', [ $this, 'admin_helpscout_beacon' ] );
232 }
233
234 if ( $this->is_request( 'frontend' ) ) {
235 add_action( 'wp_enqueue_scripts', array( $this, 'frontend_scripts' ) );
236 }
237
238 // Register admin menu
239 Core\Admin\Menu::instance()->init();
240 Core\Base::instance()->init();
241 Core\Services\Hooks::instance()->init();
242 Base\Custom_Endpoint::instance()->init();
243
244 global $current_screen;
245 $this->has_pro = class_exists('TimeticsPro');
246
247 $this->handle_buy_pro_module();
248
249 if ( function_exists('WC') ) {
250 Core\Integrations\Woocommerce\Hooks::instance()->init();
251 }
252 }
253
254 /**
255 * demo url for set pro button
256 *
257 * @return void
258 */
259 public function demo_url(){
260 return "https://arraytics.com/timetics/";
261 }
262
263 /**
264 * Register scripts and styles for admin
265 *
266 * @return void
267 */
268 public function admin_scripts( $handle ) {
269
270 if('plugins.php' === $handle){
271
272 wp_register_script( 'timetics-feedback-modal', TIMETICS_ASSETS_URL . 'js/feedback-modal.js', [ 'wp-plugins', 'wp-i18n', 'wp-element', 'wp-dom', 'wp-data' ], TIMETICS_VERSION, true );
273 wp_enqueue_script( 'timetics-feedback-modal', TIMETICS_ASSETS_URL . 'js/feedback-modal.js', [], TIMETICS_VERSION, true );
274 wp_register_style( 'timetics-feedback-modal', TIMETICS_ASSETS_URL . 'css/feedback-modal.css', [], TIMETICS_VERSION, 'all' );
275 wp_enqueue_style( 'timetics-feedback-modal', TIMETICS_ASSETS_URL . 'css/feedback-modal.css', [], TIMETICS_VERSION, 'all' );
276
277 $feedback_obj = array(
278 'site_url' => site_url(),
279 'admin_email' => get_option( 'admin_email' )
280 );
281
282 wp_localize_script( 'timetics-feedback-modal', 'timetics_feedback', $feedback_obj );
283
284 }
285
286 if ( 'toplevel_page_timetics' !== $handle) {
287 return;
288 }
289 global $wp_locale;
290
291 wp_enqueue_media();
292 wp_enqueue_style( 'wp-color-picker' );
293 wp_enqueue_style( 'timetics-admin-style', TIMETICS_ASSETS_URL . 'css/admin.css', [], TIMETICS_VERSION, 'all' );
294 wp_enqueue_style( 'timetics-vendor', TIMETICS_ASSETS_URL . 'css/vendor.css', [], TIMETICS_VERSION, 'all' );
295 wp_enqueue_script( 'timetics-flatpickr-scripts', TIMETICS_ASSETS_URL . 'js/vendors/flatpickr.js', [ 'wp-plugins', 'wp-i18n', 'wp-element', 'wp-dom', 'wp-data' ], TIMETICS_VERSION, true );
296 wp_enqueue_script( 'timetics-packages', TIMETICS_ASSETS_URL . 'js/packages.js', [ 'timetics-flatpickr-scripts' ], TIMETICS_VERSION, true );
297
298 $calendar_locale = timetics_get_option('calendar_locale');
299 if (!empty($calendar_locale)) {
300 wp_enqueue_script( 'calendar-locale', TIMETICS_ASSETS_URL . "js/local/{$calendar_locale}.js", [ 'jquery', 'wp-plugins', 'wp-i18n', 'wp-element', 'wp-dom', 'wp-data' ], TIMETICS_VERSION, true );
301 }
302
303 wp_enqueue_script( 'timetics-dashboard-scripts', TIMETICS_ASSETS_URL . 'js/dashboard.js', [ 'wp-plugins', 'wp-i18n', 'wp-element', 'wp-dom', 'wp-data', 'wp-color-picker' ], TIMETICS_VERSION, true );
304
305
306 $localize_obj = array(
307 'site_url' => site_url(),
308 'admin_url' => admin_url(),
309 'nonce' => wp_create_nonce( 'wp_rest' ),
310 'timezone' => timetics_get_timezone_list(),
311 'stripe_pub_key' => timetics_get_option( 'stripe_pub_key' ),
312 'date_format' => get_option( 'date_format' ),
313 'date_format_string' => date_i18n( get_option( 'date_format' ) ),
314 'time_format' => get_option( 'time_format' ),
315 'time_format_string' => date_i18n( get_option( 'time_format' ) ),
316 'start_of_week' => get_option( 'start_of_week', 0 ),
317
318 'default_timezone' => timetics_get_default_timezone(),
319 'currency_list' => timetics_get_currencies(),
320 'current_user_id' => get_current_user_id(),
321 'timeticsPro' => class_exists('TimeticsPro') ? true : false,
322 'demo_url' => $this->demo_url(),
323 'current_user' => timetics_get_current_user(),
324 );
325
326 $localize_obj = apply_filters( 'timetics_admin_localize_data', $localize_obj );
327
328 wp_localize_script( 'timetics-dashboard-scripts', 'timetics', $localize_obj );
329 }
330
331 /**
332 * Register scripts and styles for frontend
333 *
334 * @return void
335 */
336 public function frontend_scripts() {
337
338 wp_register_style( 'timetics-vendor', TIMETICS_ASSETS_URL . 'css/vendor.css', [], TIMETICS_VERSION, 'all' );
339 wp_register_style( 'timetics-frontend', TIMETICS_ASSETS_URL . 'css/frontend.css', [], TIMETICS_VERSION, 'all' );
340
341 wp_register_script( 'timetics-flatpickr-scripts', TIMETICS_ASSETS_URL . 'js/vendors/flatpickr.js', [ 'wp-plugins', 'wp-i18n', 'wp-element', 'wp-dom', 'wp-data' ], TIMETICS_VERSION, true );
342 wp_enqueue_script( 'timetics-packages', TIMETICS_ASSETS_URL . 'js/packages.js', [ 'timetics-flatpickr-scripts' ], TIMETICS_VERSION, true );
343
344 wp_register_script( 'timetics-frontend-scripts', TIMETICS_ASSETS_URL . 'js/frontend.js', [ 'jquery', 'wp-plugins', 'wp-i18n', 'wp-element', 'wp-dom', 'wp-data' ], TIMETICS_VERSION, true );
345
346 $calendar_locale = timetics_get_option('calendar_locale');
347 if (!empty($calendar_locale)) {
348 wp_register_script( 'calendar-locale', "https://npmcdn.com/flatpickr/dist/l10n/{$calendar_locale}.js", [ 'jquery', 'wp-plugins', 'wp-i18n', 'wp-element', 'wp-dom', 'wp-data' ], TIMETICS_VERSION, true );
349 }
350
351 // load text domain
352 wp_set_script_translations( 'timetics-frontend-scripts', 'timetics', TIMETICS_PLUGIN_DIR . 'languages/' );
353
354 global $wp_locale;
355
356 $stripe_pub_key = timetics_get_option( 'stripe_pub_key' );
357 $stripe_secret_key = timetics_get_option( 'stripe_secret_key' );
358 $stripe_configure = $stripe_pub_key && $stripe_secret_key;
359
360 $localize_obj = array(
361 'site_url' => site_url(),
362 'nonce' => wp_create_nonce( 'wp_rest' ),
363 'date_format' => get_option( 'date_format' ),
364 'time_format' => get_option( 'time_format' ),
365 'stripe_pub_key' => $stripe_pub_key,
366 'currency' => apply_filters( 'timetics_currency', timetics_get_option( 'currency', 'USD' ) ),
367 'stripe_configure' => $stripe_configure,
368 'current_user_id' => get_current_user_id(),
369 'start_of_week' => get_option( 'start_of_week', 0 ),
370 'currency_list' => timetics_get_currencies(),
371 'locale_name' => strtolower( str_replace( '_', '-', get_locale() ) )
372
373 );
374
375 $localize_obj = apply_filters( 'timetics_frontned_localize_data', $localize_obj );
376
377 wp_localize_script( 'timetics-frontend-scripts', 'timetics', $localize_obj );
378 }
379
380 /**
381 * What type of request
382 *
383 * @param string $type admin,frontend, ajax, cron
384 * @return boolean
385 */
386 private function is_request( $type ) {
387 switch ( $type ) {
388 case 'admin':
389 return is_admin();
390 case 'ajax':
391 return defined( 'DOING_AJAX' );
392 case 'cron':
393 return defined( 'DOING_CRON' );
394 case 'frontend':
395 return ( ! is_admin() || defined( 'DOING_AJAX' ) ) && ! defined( 'DOING_CRON' ) && ! $this->is_rest_api_request();
396 }
397 }
398
399 /**
400 * Returns if the request is non-legacy REST API request.
401 *
402 * @return boolean
403 */
404 private function is_rest_api_request() {
405 $server_request = isset( $_SERVER['REQUEST_URI'] ) ? sanitize_text_field( wp_unslash( $_SERVER['REQUEST_URI'] ) ) : false;
406
407 if ( ! $server_request ) {
408 return false;
409 }
410
411 $rest_prefix = trailingslashit( rest_get_url_prefix() );
412 $is_rest_request = ( false !== strpos( $server_request, $rest_prefix ) );
413
414 return apply_filters( 'timetics_is_rest_api_request', $is_rest_request );
415 }
416
417
418 /**
419 * Show buy-pro menu if pro plugin not active
420 *
421 * @return void
422 */
423 public function handle_buy_pro_module() {
424 $page = isset( $_GET['page'] ) ? sanitize_text_field( $_GET['page'] ) : '';
425
426
427 if ( 'timetics' !== $page ) {
428 return;
429 }
430
431
432 /**
433 * Show banner (codename: jhanda)
434 */
435 $filter_string = 'timetics,timetics-free-only';
436
437 if( $this->has_pro ) {
438
439 $filter_string .= ',timetics-pro';
440 $filter_string = str_replace(',timetics-free-only', '', $filter_string);
441
442 }
443
444
445 \Wpmet\Libs\Banner::instance('timetics')
446 ->is_test(true)
447 ->set_filter(ltrim($filter_string, ','))
448 ->set_api_url('https://banner.themefunction.com/public/jhanda')
449 ->set_plugin_screens('timetics')
450 ->set_plugin_screens('toplevel_page_timetics')
451 ->call();
452 // show get-help and upgrade-to-premium menu.
453 // $this->handle_get_help_and_upgrade_menu();
454 }
455
456 /**
457 * Add HelpScout script to admin footer
458 *
459 * @return void
460 */
461 public function admin_helpscout_beacon() {
462 $screen = function_exists( 'get_current_screen' ) ? get_current_screen() : null;
463 $is_timetics_screen = false;
464
465 if ( $screen ) {
466 $screen_id = isset( $screen->id ) ? $screen->id : '';
467
468 // Check: only load on Timetics top-level admin page
469 if ( 'toplevel_page_timetics' === $screen_id ) {
470 $is_timetics_screen = true;
471 }
472 }
473
474 // Allow overriding detection via filter.
475 $is_timetics_screen = apply_filters( 'timetics_is_admin_screen', $is_timetics_screen, $screen );
476
477 if ( ! $is_timetics_screen ) {
478 return;
479 }
480 ?>
481 <script type="text/javascript">!function(e,t,n){function a(){var e=t.getElementsByTagName("script")[0],n=t.createElement("script");n.type="text/javascript",n.async=!0,n.src="https://beacon-v2.helpscout.net",e.parentNode.insertBefore(n,e)}if(e.Beacon=n=function(t,n,a){e.Beacon.readyQueue.push({method:t,options:n,data:a})},n.readyQueue=[],"complete"===t.readyState)a();else if(e.attachEvent)e.attachEvent("onload",a);else e.addEventListener("load",a,!1)}(window,document,window.Beacon||function(){});</script>
482 <script type="text/javascript">
483 window.Beacon('config', {
484 color: "#0060e5",
485 });
486 window.Beacon('init', '4be24aa2-ee50-483c-a90c-db4216664d65');
487 window.Beacon('on', 'ready', function(){
488 window.Beacon('show');
489 });
490
491 </script>
492 <?php
493 }
494
495 }
496
497 /**
498 * Returns The Instance Of Timetics.
499 * The main function that is responsible for returning Timetics instance.
500 *
501 * @since 1.0.0
502 * @return Timetics
503 */
504 function timetics() {
505 return Bootstrap::instantiate();
506 }
507