Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
95.24% covered (success)
95.24%
20 / 21
85.71% covered (success)
85.71%
6 / 7
CRAP
0.00% covered (danger)
0.00%
0 / 1
Assets
95.24% covered (success)
95.24%
20 / 21
85.71% covered (success)
85.71%
6 / 7
11
0.00% covered (danger)
0.00%
0 / 1
 name
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 init
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 register_login_styles
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 enqueue_login_styles
100.00% covered (success)
100.00%
6 / 6
100.00% covered (success)
100.00%
1 / 1
3
 register_script
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
1
 register_style
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
1
 get_file_version
75.00% covered (success)
75.00%
3 / 4
0.00% covered (danger)
0.00%
0 / 1
3.14
1<?php
2/**
3 * Assets class.
4 *
5 * This will manage the assets file (css/js)
6 * for adding style and JS functionality.
7 *
8 * @package RtCamp\GoogleLogin
9 * @since   1.0.0
10 */
11
12declare( strict_types=1 );
13
14namespace RtCamp\GoogleLogin\Modules;
15
16use RtCamp\GoogleLogin\Interfaces\Module as ModuleInterface;
17use function RtCamp\GoogleLogin\plugin;
18
19/**
20 * Class Assets
21 *
22 * @package RtCamp\GoogleLogin\Modules
23 */
24class Assets implements ModuleInterface {
25
26    /**
27     * Handle for login button style.
28     *
29     * @var string
30     */
31    const LOGIN_BUTTON_STYLE_HANDLE = 'login-with-google';
32
33    /**
34     * Module name.
35     *
36     * @return string
37     */
38    public function name(): string {
39        return 'assets';
40    }
41
42    /**
43     * Initialize the assets file
44     *
45     * @return void
46     */
47    public function init(): void {
48        add_action( 'login_enqueue_scripts', [ $this, 'enqueue_login_styles' ] );
49    }
50
51    /**
52     * Register style/script for Login Page.
53     *
54     * @action login_enqueue_scripts
55     *
56     * @return void
57     */
58    public function register_login_styles(): void {
59        $this->register_style( self::LOGIN_BUTTON_STYLE_HANDLE, 'build/css/login.css' );
60    }
61
62    /**
63     * Enqueue the login style.
64     *
65     * @return void
66     */
67    public function enqueue_login_styles(): void {
68        /**
69         * If style is not registered, register it.
70         */
71        if ( ! wp_style_is( self::LOGIN_BUTTON_STYLE_HANDLE, 'registered' ) ) {
72            $this->register_login_styles();
73        }
74
75        if ( ! wp_script_is( 'login-with-google-script', 'registered' ) ) {
76            $this->register_script( 'login-with-google-script', 'build/js/login.js' );
77        }
78
79        wp_enqueue_script( 'login-with-google-script' );
80        wp_enqueue_style( self::LOGIN_BUTTON_STYLE_HANDLE );
81    }
82
83    /**
84     * Register a new script.
85     *
86     * @param  string           $handle    Name of the script. Should be unique.
87     * @param  string|bool      $file      script file, path of the script relative to the assets/build/ directory.
88     * @param  array            $deps      Optional. An array of registered script handles this script depends on. Default empty array.
89     * @param  string|bool|null $ver       Optional. String specifying script version number, if not set, filetime will be used as version number.
90     * @param  bool             $in_footer Optional. Whether to enqueue the script before </body> instead of in the <head>.
91     *                                     Default 'false'.
92     * @return bool Whether the script has been registered. True on success, false on failure.
93     */
94    public function register_script( $handle, $file, $deps = [], $ver = false, $in_footer = true ) {
95        $src     = sprintf( '%1$sassets/%2$s', plugin()->url, $file );
96        $version = $this->get_file_version( $file, $ver );
97
98        return wp_register_script( $handle, $src, $deps, $version, $in_footer );
99    }
100
101    /**
102     * Register a CSS stylesheet.
103     *
104     * @param string           $handle Name of the stylesheet. Should be unique.
105     * @param string|bool      $file   style file, path of the script relative to the assets/build/ directory.
106     * @param array            $deps   Optional. An array of registered stylesheet handles this stylesheet depends on. Default empty array.
107     * @param string|bool|null $ver    Optional. String specifying script version number, if not set, filetime will be used as version number.
108     * @param string           $media  Optional. The media for which this stylesheet has been defined.
109     *                                 Default 'all'. Accepts media types like 'all', 'print' and 'screen', or media queries like
110     *                                 '(orientation: portrait)' and '(max-width: 640px)'.
111     *
112     * @return bool Whether the style has been registered. True on success, false on failure.
113     */
114    public function register_style( $handle, $file, $deps = [], $ver = false, $media = 'all' ) {
115        $src     = sprintf( '%1$sassets/%2$s', plugin()->url, $file );
116        $version = $this->get_file_version( $file, $ver );
117
118        return wp_register_style( $handle, $src, $deps, $version, $media );
119    }
120
121    /**
122     * Get file version.
123     *
124     * @param string             $file File path.
125     * @param int|string|boolean $ver  File version.
126     *
127     * @return bool|false|int
128     */
129    private function get_file_version( $file, $ver = false ) {
130        if ( ! empty( $ver ) ) {
131            return $ver;
132        }
133
134        $file_path = sprintf( '%s/%s', plugin()->assets_dir, $file );
135
136        return file_exists( $file_path ) ? filemtime( $file_path ) : false;
137    }
138}