PluginProbe ʕ •ᴥ•ʔ
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments / 3.0.3
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments v3.0.3
4.4.2 4.4.1 4.4.0 4.3.3 4.3.2 4.3.1 4.3.0 4.2.3 4.2.2 4.2.1 1.0.3 1.0.4 1.0.5 1.0.6 1.1.0 1.1.1 1.1.10 1.1.11 1.1.12 1.1.13 1.1.14 1.1.15 1.1.16 1.1.17 1.1.18 1.1.19 1.1.2 1.1.3 1.1.4 1.1.5 1.1.6 1.1.7 1.1.8 1.1.9 1.10.0 1.10.1 1.10.2 1.10.3 1.10.4 1.11.0 1.11.1 1.11.2 1.2.0 1.2.1 1.2.2 1.2.3 1.2.4 1.2.5 1.3.0 1.3.1 1.3.2 1.3.3 1.3.4 1.4.0 1.4.1 1.4.2 1.5.0 1.5.1 1.5.2 1.5.3 1.5.4 1.5.5 1.5.6 1.5.7 1.5.8 1.6.0 1.6.1 1.6.2 1.6.3 1.6.4 1.7.0 1.7.1 1.7.2 1.8.0 1.8.1 1.8.2 1.8.3 1.8.4 1.8.5 1.9.0 1.9.1 1.9.2 1.9.3 1.9.4 1.9.5 2.0.0 2.0.1 2.1.0 2.1.1 2.1.2 2.1.3 2.1.4 2.10.0 2.10.1 2.11.0 2.11.1 2.11.2 2.11.3 2.11.4 2.12.0 2.13.0 2.14.0 2.14.1 2.15.0 2.15.1 2.16.0 2.16.1 2.16.2 2.16.3 2.17.0 2.17.1 2.17.2 2.18.0 2.19.0 2.19.2 2.19.3 2.19.4 2.2.0 2.2.1 2.20.0 2.20.1 2.20.2 2.20.3 2.20.4 2.20.5 2.20.6 2.21.0 2.22.0 2.22.1 2.23.0 2.24.0 2.25.0 2.25.1 2.25.2 2.26.0 2.27.0 2.27.1 2.28.0 2.29.0 2.29.1 2.29.2 2.29.3 2.29.4 2.3.0 2.3.1 2.30.0 2.31.0 2.31.1 2.31.2 2.31.3 2.4.0 2.4.1 2.4.2 2.4.3 2.4.4 2.40.0 2.40.1 2.5.0 2.5.1 2.5.2 2.6.0 2.6.1 2.6.2 2.7.0 2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.8.0 2.8.1 2.8.2 2.8.3 2.8.4 2.9.0 3.0.0 3.0.0-RC1 3.0.0-RC2 3.0.0-beta1 3.0.0-beta2 3.0.1 3.0.2 3.0.3 3.0.4 3.0.5 3.1.0 3.1.1 3.1.2 3.1.3 3.1.4 3.1.5 3.1.6 3.10.0 3.10.1 3.11.0 3.12.0 3.13.0 3.13.1 3.13.2 3.13.3 3.13.4 3.14.0 3.15.0 3.15.1 3.15.2 3.15.3 3.15.4 3.15.5 3.16.0 3.16.1 3.16.2 3.16.3 3.16.4 3.16.5 3.16.6 3.16.7 3.16.8 3.17.0 3.17.1 3.17.2 3.17.3 3.17.4 3.17.5 3.17.6 3.18.0 3.19.0 3.19.1 3.19.2 3.2.0 3.2.1 3.2.2 3.20.0 3.20.1 3.3.0 3.3.1 3.4.0 3.4.1 3.4.2 3.4.3 3.5.0 3.5.1 3.5.2 3.5.3 3.6.0 3.6.1 3.6.2 3.7.0 3.7.1 3.7.2 3.7.3 3.8.0 3.8.1 3.8.2 3.8.3 3.8.4 3.8.5 3.9.0 4.0.0 4.0.1 4.0.2 4.0.3 trunk 4.1.0 0.2.19.1 4.1.1 1.0.0 4.2.0 1.0.1 1.0.2
surecart / app / src / WordPress / Assets / PreloadService.php
surecart / app / src / WordPress / Assets Last commit date
AssetsService.php 2 years ago AssetsServiceProvider.php 3 years ago BlockAssetsLoadService.php 1 year ago PreloadService.php 1 year ago ScriptsService.php 1 year ago StylesService.php 1 year ago
PreloadService.php
143 lines
1 <?php
2 namespace SureCart\WordPress\Assets;
3
4 use SureCart\Support\Arrays;
5
6 /**
7 * Handles the preloading functionality for components.
8 */
9 class PreloadService {
10 /**
11 * The stats file path.
12 *
13 * @var string
14 */
15 protected $stats_file;
16
17 /**
18 * Components to preload.
19 *
20 * @var array
21 */
22 protected $components = [];
23
24 /**
25 * Get the stats file path
26 *
27 * @param string $stats_file The stats file path.
28 */
29 public function __construct( $stats_file ) {
30 $this->stats_file = $stats_file;
31 }
32
33 /**
34 * Bootstrap the preload.
35 *
36 * @return void
37 */
38 public function bootstrap() {
39 // add preload tags to head, footer as fallback.
40 add_action( 'wp_head', [ $this, 'renderComponents' ] );
41 add_action( 'wp_footer', [ $this, 'renderComponents' ] );
42 }
43
44 /**
45 * Get the bundle stats file.
46 *
47 * @return object|false;
48 */
49 protected function getStatsFile() {
50 if ( ! file_exists( $this->stats_file ) ) {
51 return false;
52 }
53 return wp_json_file_decode( $this->stats_file, [ 'associative' => true ] );
54 }
55
56 /**
57 * Get the filenames from the stats.
58 *
59 * @param array $components An array of component names.
60 * @param string $format The format we are using.
61 *
62 * @return array
63 */
64 public function getFileNames( $components, $format = 'esmBrowser' ) {
65 $json = $this->getStatsFile();
66 $entries = $json['formats'][ $format ] ?? [];
67
68 $set = array_map(
69 function( $element ) use ( $entries ) {
70 $files = [];
71 $collection_bundles = array_filter(
72 $entries,
73 function( $entry ) use ( $element ) {
74 return in_array( $element, $entry['components'], true );
75 }
76 );
77
78 foreach ( $collection_bundles as $bundle ) {
79 $files = array_merge( [ $bundle['fileName'] ], $bundle['imports'] );
80 }
81
82 return $files;
83 },
84 $components
85 );
86
87 return array_unique( Arrays::flatten( $set ) );
88 }
89
90 /**
91 * Render the components
92 *
93 * @return void
94 */
95 public function renderComponents() {
96 // For Single product page, we no longer need to preload the components.
97 if ( is_singular( 'sc_product' ) ) {
98 return;
99 }
100
101 if ( ! empty( $this->components ) ) {
102 $this->renderTag( $this->components );
103 $this->components = [];
104 }
105 }
106
107 /**
108 * Render the preload tags.
109 *
110 * @param array $components An array of components.
111 * @param string $format The format.
112 * @param string $path The path to the component javascript file.
113 *
114 * @return void
115 */
116 public function renderTag( $components, $format = 'esmBrowser', $path = 'dist/components/surecart/' ) {
117 if ( empty( $components ) ) {
118 return;
119 }
120
121 $names = $this->getFileNames( $components, $format );
122
123 if ( empty( $names ) ) {
124 return;
125 }
126
127 foreach ( $names as $name ) {
128 echo "<link rel='preload' href='" . esc_url( trailingslashit( \SureCart::core()->assets()->getUrl() ) . trailingslashit( $path ) . $name ) . "' as='script' crossorigin />\n";
129 }
130 }
131
132 /**
133 * Add preload components.
134 *
135 * @param array $components Component names.
136 *
137 * @return void
138 */
139 public function add( $components ) {
140 $this->components = array_filter( array_unique( array_merge( $this->components, $components ) ) );
141 }
142 }
143