5a1207f2b5057b047ab1bf92f8ab6ce7a0d29762R193">193
+			inputPaths = (
194
+			);
195
+			name = "[CP] Embed Pods Frameworks";
196
+			outputPaths = (
197
+			);
198
+			runOnlyForDeploymentPostprocessing = 0;
199
+			shellPath = /bin/sh;
200
+			shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-App/Pods-App-frameworks.sh\"\n";
201
+			showEnvVarsInLog = 0;
202
+		};
203
+/* End PBXShellScriptBuildPhase section */
204
+
205
+/* Begin PBXSourcesBuildPhase section */
206
+		504EC3001FED79650016851F /* Sources */ = {
207
+			isa = PBXSourcesBuildPhase;
208
+			buildActionMask = 2147483647;
209
+			files = (
210
+				504EC3081FED79650016851F /* AppDelegate.swift in Sources */,
211
+			);
212
+			runOnlyForDeploymentPostprocessing = 0;
213
+		};
214
+/* End PBXSourcesBuildPhase section */
215
+
216
+/* Begin PBXVariantGroup section */
217
+		504EC30B1FED79650016851F /* Main.storyboard */ = {
218
+			isa = PBXVariantGroup;
219
+			children = (
220
+				504EC30C1FED79650016851F /* Base */,
221
+			);
222
+			name = Main.storyboard;
223
+			sourceTree = "<group>";
224
+		};
225
+		504EC3101FED79650016851F /* LaunchScreen.storyboard */ = {
226
+			isa = PBXVariantGroup;
227
+			children = (
228
+				504EC3111FED79650016851F /* Base */,
229
+			);
230
+			name = LaunchScreen.storyboard;
231
+			sourceTree = "<group>";
232
+		};
233
+/* End PBXVariantGroup section */
234
+
235
+/* Begin XCBuildConfiguration section */
236
+		504EC3141FED79650016851F /* Debug */ = {
237
+			isa = XCBuildConfiguration;
238
+			buildSettings = {
239
+				ALWAYS_SEARCH_USER_PATHS = NO;
240
+				CLANG_ANALYZER_NONNULL = YES;
241
+				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
242
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
243
+				CLANG_CXX_LIBRARY = "libc++";
244
+				CLANG_ENABLE_MODULES = YES;
245
+				CLANG_ENABLE_OBJC_ARC = YES;
246
+				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
247
+				CLANG_WARN_BOOL_CONVERSION = YES;
248
+				CLANG_WARN_COMMA = YES;
249
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
250
+				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
251
+				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
252
+				CLANG_WARN_EMPTY_BODY = YES;
253
+				CLANG_WARN_ENUM_CONVERSION = YES;
254
+				CLANG_WARN_INFINITE_RECURSION = YES;
255
+				CLANG_WARN_INT_CONVERSION = YES;
256
+				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
257
+				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
258
+				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
259
+				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
260
+				CLANG_WARN_STRICT_PROTOTYPES = YES;
261
+				CLANG_WARN_SUSPICIOUS_MOVE = YES;
262
+				CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
263
+				CLANG_WARN_UNREACHABLE_CODE = YES;
264
+				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
265
+				CODE_SIGN_IDENTITY = "iPhone Developer";
266
+				COPY_PHASE_STRIP = NO;
267
+				DEBUG_INFORMATION_FORMAT = dwarf;
268
+				ENABLE_STRICT_OBJC_MSGSEND = YES;
269
+				ENABLE_TESTABILITY = YES;
270
+				GCC_C_LANGUAGE_STANDARD = gnu11;
271
+				GCC_DYNAMIC_NO_PIC = NO;
272
+				GCC_NO_COMMON_BLOCKS = YES;
273
+				GCC_OPTIMIZATION_LEVEL = 0;
274
+				GCC_PREPROCESSOR_DEFINITIONS = (
275
+					"DEBUG=1",
276
+					"$(inherited)",
277
+				);
278
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
279
+				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
280
+				GCC_WARN_UNDECLARED_SELECTOR = YES;
281
+				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
282
+				GCC_WARN_UNUSED_FUNCTION = YES;
283
+				GCC_WARN_UNUSED_VARIABLE = YES;
284
+				IPHONEOS_DEPLOYMENT_TARGET = 13.0;
285
+				MTL_ENABLE_DEBUG_INFO = YES;
286
+				ONLY_ACTIVE_ARCH = YES;
287
+				SDKROOT = iphoneos;
288
+				SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
289
+				SWIFT_OPTIMIZATION_LEVEL = "-Onone";
290
+			};
291
+			name = Debug;
292
+		};
293
+		504EC3151FED79650016851F /* Release */ = {
294
+			isa = XCBuildConfiguration;
295
+			buildSettings = {
296
+				ALWAYS_SEARCH_USER_PATHS = NO;
297
+				CLANG_ANALYZER_NONNULL = YES;
298
+				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
299
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
300
+				CLANG_CXX_LIBRARY = "libc++";
301
+				CLANG_ENABLE_MODULES = YES;
302
+				CLANG_ENABLE_OBJC_ARC = YES;
303
+				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
304
+				CLANG_WARN_BOOL_CONVERSION = YES;
305
+				CLANG_WARN_COMMA = YES;
306
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
307
+				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
308
+				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
309
+				CLANG_WARN_EMPTY_BODY = YES;
310
+				CLANG_WARN_ENUM_CONVERSION = YES;
311
+				CLANG_WARN_INFINITE_RECURSION = YES;
312
+				CLANG_WARN_INT_CONVERSION = YES;
313
+				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
314
+				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
315
+				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
316
+				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
317
+				CLANG_WARN_STRICT_PROTOTYPES = YES;
318
+				CLANG_WARN_SUSPICIOUS_MOVE = YES;
319
+				CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
320
+				CLANG_WARN_UNREACHABLE_CODE = YES;
321
+				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
322
+				CODE_SIGN_IDENTITY = "iPhone Developer";
323
+				COPY_PHASE_STRIP = NO;
324
+				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
325
+				ENABLE_NS_ASSERTIONS = NO;
326
+				ENABLE_STRICT_OBJC_MSGSEND = YES;
327
+				GCC_C_LANGUAGE_STANDARD = gnu11;
328
+				GCC_NO_COMMON_BLOCKS = YES;
329
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
330
+				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
331
+				GCC_WARN_UNDECLARED_SELECTOR = YES;
332
+				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
333
+				GCC_WARN_UNUSED_FUNCTION = YES;
334
+				GCC_WARN_UNUSED_VARIABLE = YES;
335
+				IPHONEOS_DEPLOYMENT_TARGET = 13.0;
336
+				MTL_ENABLE_DEBUG_INFO = NO;
337
+				SDKROOT = iphoneos;
338
+				SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
339
+				VALIDATE_PRODUCT = YES;
340
+			};
341
+			name = Release;
342
+		};
343
+		504EC3171FED79650016851F /* Debug */ = {
344
+			isa = XCBuildConfiguration;
345
+			baseConfigurationReference = FC68EB0AF532CFC21C3344DD /* Pods-App.debug.xcconfig */;
346
+			buildSettings = {
347
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
348
+				CODE_SIGN_STYLE = Automatic;
349
+				CURRENT_PROJECT_VERSION = 1;
350
+				DEVELOPMENT_TEAM = 5QTJEGL2H2;
351
+				INFOPLIST_FILE = App/Info.plist;
352
+				IPHONEOS_DEPLOYMENT_TARGET = 13.0;
353
+				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
354
+				MARKETING_VERSION = 1.0;
355
+				OTHER_SWIFT_FLAGS = "$(inherited) \"-D\" \"COCOAPODS\" \"-DDEBUG\"";
356
+				PRODUCT_BUNDLE_IDENTIFIER = net.simplico.tmtlive;
357
+				PRODUCT_NAME = "$(TARGET_NAME)";
358
+				SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
359
+				SWIFT_VERSION = 5.0;
360
+				TARGETED_DEVICE_FAMILY = "1,2";
361
+			};
362
+			name = Debug;
363
+		};
364
+		504EC3181FED79650016851F /* Release */ = {
365
+			isa = XCBuildConfiguration;
366
+			baseConfigurationReference = AF51FD2D460BCFE21FA515B2 /* Pods-App.release.xcconfig */;
367
+			buildSettings = {
368
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
369
+				CODE_SIGN_STYLE = Automatic;
370
+				CURRENT_PROJECT_VERSION = 1;
371
+				DEVELOPMENT_TEAM = 5QTJEGL2H2;
372
+				INFOPLIST_FILE = App/Info.plist;
373
+				IPHONEOS_DEPLOYMENT_TARGET = 13.0;
374
+				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
375
+				MARKETING_VERSION = 1.0;
376
+				PRODUCT_BUNDLE_IDENTIFIER = net.simplico.tmtlive;
377
+				PRODUCT_NAME = "$(TARGET_NAME)";
378
+				SWIFT_ACTIVE_COMPILATION_CONDITIONS = "";
379
+				SWIFT_VERSION = 5.0;
380
+				TARGETED_DEVICE_FAMILY = "1,2";
381
+			};
382
+			name = Release;
383
+		};
384
+/* End XCBuildConfiguration section */
385
+
386
+/* Begin XCConfigurationList section */
387
+		504EC2FF1FED79650016851F /* Build configuration list for PBXProject "App" */ = {
388
+			isa = XCConfigurationList;
389
+			buildConfigurations = (
390
+				504EC3141FED79650016851F /* Debug */,
391
+				504EC3151FED79650016851F /* Release */,
392
+			);
393
+			defaultConfigurationIsVisible = 0;
394
+			defaultConfigurationName = Release;
395
+		};
396
+		504EC3161FED79650016851F /* Build configuration list for PBXNativeTarget "App" */ = {
397
+			isa = XCConfigurationList;
398
+			buildConfigurations = (
399
+				504EC3171FED79650016851F /* Debug */,
400
+				504EC3181FED79650016851F /* Release */,
401
+			);
402
+			defaultConfigurationIsVisible = 0;
403
+			defaultConfigurationName = Release;
404
+		};
405
+/* End XCConfigurationList section */
406
+	};
407
+	rootObject = 504EC2FC1FED79650016851F /* Project object */;
408
+}

+ 7 - 0
ios/App/App.xcodeproj/project.xcworkspace/contents.xcworkspacedata

@@ -0,0 +1,7 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<Workspace
3
+   version = "1.0">
4
+   <FileRef
5
+      location = "self:App.xcodeproj">
6
+   </FileRef>
7
+</Workspace>

+ 10 - 0
ios/App/App.xcworkspace/contents.xcworkspacedata

@@ -0,0 +1,10 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<Workspace
3
+   version = "1.0">
4
+   <FileRef
5
+      location = "group:App.xcodeproj">
6
+   </FileRef>
7
+   <FileRef
8
+      location = "group:Pods/Pods.xcodeproj">
9
+   </FileRef>
10
+</Workspace>

+ 8 - 0
ios/App/App.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist

@@ -0,0 +1,8 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+<plist version="1.0">
4
+<dict>
5
+	<key>IDEDidComputeMac32BitWarning</key>
6
+	<true/>
7
+</dict>
8
+</plist>

+ 63 - 0
ios/App/App/AppDelegate.swift

@@ -0,0 +1,63 @@
1
+import UIKit
2
+import Capacitor
3
+import FBSDKCoreKit
4
+
5
+
6
+@UIApplicationMain
7
+class AppDelegate: UIResponder, UIApplicationDelegate {
8
+
9
+    var window: UIWindow?
10
+
11
+    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
12
+        // Override point for customization after application launch.
13
+        FBSDKCoreKit.ApplicationDelegate.shared.application(application, didFinishLaunchingWithOptions: launchOptions)
14
+        return true
15
+    }
16
+
17
+    func applicationWillResignActive(_ application: UIApplication) {
18
+        // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
19
+        // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game.
20
+    }
21
+
22
+    func applicationDidEnterBackground(_ application: UIApplication) {
23
+        // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
24
+        // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
25
+    }
26
+
27
+    func applicationWillEnterForeground(_ application: UIApplication) {
28
+        // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.
29
+    }
30
+
31
+    func applicationDidBecomeActive(_ application: UIApplication) {
32
+        // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
33
+    }
34
+
35
+    func applicationWillTerminate(_ application: UIApplication) {
36
+        // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
37
+    }
38
+
39
+    func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool {
40
+        // Called when the app was launched with a url. Feel free to add additional processing here,
41
+        // but if you want the App API to support tracking app url opens, make sure to keep this call
42
+        //return ApplicationDelegateProxy.shared.application(app, open: url, options: options)
43
+        
44
+        if (FBSDKCoreKit.ApplicationDelegate.shared.application(
45
+                    app,
46
+                    open: url,
47
+                    sourceApplication: options[UIApplication.OpenURLOptionsKey.sourceApplication] as? String,
48
+                    annotation: options[UIApplication.OpenURLOptionsKey.annotation]
49
+                )) {
50
+                    return true;
51
+                } else {
52
+                    return ApplicationDelegateProxy.shared.application(app, open: url, options: options)
53
+                }
54
+    }
55
+
56
+    func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
57
+        // Called when the app was launched with an activity, including Universal Links.
58
+        // Feel free to add additional processing here, but if you want the App API to support
59
+        // tracking app url opens, make sure to keep this call
60
+        return ApplicationDelegateProxy.shared.application(application, continue: userActivity, restorationHandler: restorationHandler)
61
+    }
62
+
63
+}

BIN
ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-512@2x.png


+ 14 - 0
ios/App/App/Assets.xcassets/AppIcon.appiconset/Contents.json

@@ -0,0 +1,14 @@
1
+{
2
+  "images" : [
3
+    {
4
+      "filename" : "AppIcon-512@2x.png",
5
+      "idiom" : "universal",
6
+      "platform" : "ios",
7
+      "size" : "1024x1024"
8
+    }
9
+  ],
10
+  "info" : {
11
+    "author" : "xcode",
12
+    "version" : 1
13
+  }
14
+}

+ 6 - 0
ios/App/App/Assets.xcassets/Contents.json

@@ -0,0 +1,6 @@
1
+{
2
+  "info" : {
3
+    "version" : 1,
4
+    "author" : "xcode"
5
+  }
6
+}

+ 23 - 0
ios/App/App/Assets.xcassets/Splash.imageset/Contents.json

@@ -0,0 +1,23 @@
1
+{
2
+  "images" : [
3
+    {
4
+      "idiom" : "universal",
5
+      "filename" : "splash-2732x2732-2.png",
6
+      "scale" : "1x"
7
+    },
8
+    {
9
+      "idiom" : "universal",
10
+      "filename" : "splash-2732x2732-1.png",
11
+      "scale" : "2x"
12
+    },
13
+    {
14
+      "idiom" : "universal",
15
+      "filename" : "splash-2732x2732.png",
16
+      "scale" : "3x"
17
+    }
18
+  ],
19
+  "info" : {
20
+    "version" : 1,
21
+    "author" : "xcode"
22
+  }
23
+}

BIN
ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-1.png


BIN
ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-2.png


BIN
ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732.png


+ 32 - 0
ios/App/App/Base.lproj/LaunchScreen.storyboard

@@ -0,0 +1,32 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="17132" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
3
+    <device id="retina4_7" orientation="portrait" appearance="light"/>
4
+    <dependencies>
5
+        <deployment identifier="iOS"/>
6
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="17105"/>
7
+        <capability name="System colors in document resources" minToolsVersion="11.0"/>
8
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
9
+    </dependencies>
10
+    <scenes>
11
+        <!--View Controller-->
12
+        <scene sceneID="EHf-IW-A2E">
13
+            <objects>
14
+                <viewController id="01J-lp-oVM" sceneMemberID="viewController">
15
+                    <imageView key="view" userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="Splash" id="snD-IY-ifK">
16
+                        <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
17
+                        <autoresizingMask key="autoresizingMask"/>
18
+                        <color key="backgroundColor" systemColor="systemBackgroundColor"/>
19
+                    </imageView>
20
+                </viewController>
21
+                <placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
22
+            </objects>
23
+            <point key="canvasLocation" x="53" y="375"/>
24
+        </scene>
25
+    </scenes>
26
+    <resources>
27
+        <image name="Splash" width="1366" height="1366"/>
28
+        <systemColor name="systemBackgroundColor">
29
+            <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
30
+        </systemColor>
31
+    </resources>
32
+</document>

+ 19 - 0
ios/App/App/Base.lproj/Main.storyboard

@@ -0,0 +1,19 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="14111" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="BYZ-38-t0r">
3
+    <device id="retina4_7" orientation="portrait">
4
+        <adaptation id="fullscreen"/>
5
+    </device>
6
+    <dependencies>
7
+        <deployment identifier="iOS"/>
8
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14088"/>
9
+    </dependencies>
10
+    <scenes>
11
+        <!--Bridge View Controller-->
12
+        <scene sceneID="tne-QT-ifu">
13
+            <objects>
14
+                <viewController id="BYZ-38-t0r" customClass="CAPBridgeViewController" customModule="Capacitor" sceneMemberID="viewController"/>
15
+                <placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
16
+            </objects>
17
+        </scene>
18
+    </scenes>
19
+</document>

+ 82 - 0
ios/App/App/Info.plist

@@ -0,0 +1,82 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+<plist version="1.0">
4
+<dict>
5
+	<key>CFBundleDevelopmentRegion</key>
6
+	<string>en</string>
7
+	<key>CFBundleDisplayName</key>
8
+	<string>TMTApp</string>
9
+	<key>CFBundleExecutable</key>
10
+	<string>$(EXECUTABLE_NAME)</string>
11
+	<key>CFBundleIdentifier</key>
12
+	<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
13
+	<key>CFBundleInfoDictionaryVersion</key>
14
+	<string>6.0</string>
15
+	<key>CFBundleName</key>
16
+	<string>$(PRODUCT_NAME)</string>
17
+	<key>CFBundlePackageType</key>
18
+	<string>APPL</string>
19
+	<key>CFBundleShortVersionString</key>
20
+	<string>$(MARKETING_VERSION)</string>
21
+	<key>CFBundleVersion</key>
22
+	<string>$(CURRENT_PROJECT_VERSION)</string>
23
+	<key>LSRequiresIPhoneOS</key>
24
+	<true/>
25
+	<key>UILaunchStoryboardName</key>
26
+	<string>LaunchScreen</string>
27
+	<key>UIMainStoryboardFile</key>
28
+	<string>Main</string>
29
+	<key>UIRequiredDeviceCapabilities</key>
30
+	<array>
31
+		<string>armv7</string>
32
+	</array>
33
+	<key>UISupportedInterfaceOrientations</key>
34
+	<array>
35
+		<string>UIInterfaceOrientationPortrait</string>
36
+		<string>UIInterfaceOrientationLandscapeLeft</string>
37
+		<string>UIInterfaceOrientationLandscapeRight</string>
38
+	</array>
39
+	<key>UISupportedInterfaceOrientations~ipad</key>
40
+	<array>
41
+		<string>UIInterfaceOrientationPortrait</string>
42
+		<string>UIInterfaceOrientationPortraitUpsideDown</string>
43
+		<string>UIInterfaceOrientationLandscapeLeft</string>
44
+		<string>UIInterfaceOrientationLandscapeRight</string>
45
+	</array>
46
+	<key>UIViewControllerBasedStatusBarAppearance</key>
47
+	<true/>
48
+    <key>CFBundleURLTypes</key>
49
+        <array>
50
+        <dict>
51
+            <key>CFBundleURLSchemes</key>
52
+            <array>
53
+            <string>fb200395709360570</string>
54
+            </array>
55
+        </dict>
56
+        </array>
57
+        <key>FacebookAppID</key>
58
+        <string>200395709360570</string>
59
+        <key>FacebookClientToken</key>
60
+        <string>a3ae16e80d605bab9483feaa4c523e84</string>
61
+        <key>FacebookDisplayName</key>
62
+        <string>tigermuaythai.live</string>
63
+        <key>LSApplicationQueriesSchemes</key>
64
+        <array>
65
+            <string>fbapi</string>
66
+            <string>fbapi20130214</string>
67
+            <string>fbapi20130410</string>
68
+            <string>fbapi20130702</string>
69
+            <string>fbapi20131010</string>
70
+            <string>fbapi20131219</string>
71
+            <string>fbapi20140410</string>
72
+            <string>fbapi20140116</string>
73
+            <string>fbapi20150313</string>
74
+            <string>fbapi20150629</string>
75
+            <string>fbapi20160328</string>
76
+            <string>fbauth</string>
77
+            <string>fb-messenger-share-api</string>
78
+            <string>fbauth2</string>
79
+            <string>fbshareextension</string>
80
+        </array>
81
+</dict>
82
+</plist>

+ 29 - 0
ios/App/Podfile

@@ -0,0 +1,29 @@
1
+require_relative '../../node_modules/@capacitor/ios/scripts/pods_helpers'
2
+
3
+platform :ios, '13.0'
4
+use_frameworks!
5
+
6
+# workaround to avoid Xcode caching of Pods that requires
7
+# Product -> Clean Build Folder after new Cordova plugins installed
8
+# Requires CocoaPods 1.6 or newer
9
+install! 'cocoapods', :disable_input_output_paths => true
10
+
11
+def capacitor_pods
12
+  pod 'Capacitor', :path => '../../node_modules/@capacitor/ios'
13
+  pod 'CapacitorCordova', :path => '../../node_modules/@capacitor/ios'
14
+  pod 'CapacitorCommunityFacebookLogin', :path => '../../node_modules/@capacitor-community/facebook-login'
15
+  pod 'CapacitorApp', :path => '../../node_modules/@capacitor/app'
16
+  pod 'CapacitorHaptics', :path => '../../node_modules/@capacitor/haptics'
17
+  pod 'CapacitorKeyboard', :path => '../../node_modules/@capacitor/keyboard'
18
+  pod 'CapacitorPreferences', :path => '../../node_modules/@capacitor/preferences'
19
+  pod 'CapacitorStatusBar', :path => '../../node_modules/@capacitor/status-bar'
20
+end
21
+
22
+target 'App' do
23
+  capacitor_pods
24
+  # Add your Pods here
25
+end
26
+
27
+post_install do |installer|
28
+  assertDeploymentTarget(installer)
29
+end

+ 79 - 0
ios/App/Podfile.lock

@@ -0,0 +1,79 @@
1
+PODS:
2
+  - Capacitor (5.5.0):
3
+    - CapacitorCordova
4
+  - CapacitorApp (5.0.6):
5
+    - Capacitor
6
+  - CapacitorCommunityFacebookLogin (5.0.3):
7
+    - Capacitor
8
+    - FBSDKCoreKit (= 16.1.3)
9
+    - FBSDKLoginKit (= 16.1.3)
10
+  - CapacitorCordova (5.5.0)
11
+  - CapacitorHaptics (5.0.6):
12
+    - Capacitor
13
+  - CapacitorKeyboard (5.0.6):
14
+    - Capacitor
15
+  - CapacitorPreferences (5.0.6):
16
+    - Capacitor
17
+  - CapacitorStatusBar (5.0.6):
18
+    - Capacitor
19
+  - FBAEMKit (16.1.3):
20
+    - FBSDKCoreKit_Basics (= 16.1.3)
21
+  - FBSDKCoreKit (16.1.3):
22
+    - FBAEMKit (= 16.1.3)
23
+    - FBSDKCoreKit_Basics (= 16.1.3)
24
+  - FBSDKCoreKit_Basics (16.1.3)
25
+  - FBSDKLoginKit (16.1.3):
26
+    - FBSDKCoreKit (= 16.1.3)
27
+
28
+DEPENDENCIES:
29
+  - "Capacitor (from `../../node_modules/@capacitor/ios`)"
30
+  - "CapacitorApp (from `../../node_modules/@capacitor/app`)"
31
+  - "CapacitorCommunityFacebookLogin (from `../../node_modules/@capacitor-community/facebook-login`)"
32
+  - "CapacitorCordova (from `../../node_modules/@capacitor/ios`)"
33
+  - "CapacitorHaptics (from `../../node_modules/@capacitor/haptics`)"
34
+  - "CapacitorKeyboard (from `../../node_modules/@capacitor/keyboard`)"
35
+  - "CapacitorPreferences (from `../../node_modules/@capacitor/preferences`)"
36
+  - "CapacitorStatusBar (from `../../node_modules/@capacitor/status-bar`)"
37
+
38
+SPEC REPOS:
39
+  trunk:
40
+    - FBAEMKit
41
+    - FBSDKCoreKit
42
+    - FBSDKCoreKit_Basics
43
+    - FBSDKLoginKit
44
+
45
+EXTERNAL SOURCES:
46
+  Capacitor:
47
+    :path: "../../node_modules/@capacitor/ios"
48
+  CapacitorApp:
49
+    :path: "../../node_modules/@capacitor/app"
50
+  CapacitorCommunityFacebookLogin:
51
+    :path: "../../node_modules/@capacitor-community/facebook-login"
52
+  CapacitorCordova:
53
+    :path: "../../node_modules/@capacitor/ios"
54
+  CapacitorHaptics:
55
+    :path: "../../node_modules/@capacitor/haptics"
56
+  CapacitorKeyboard:
57
+    :path: "../../node_modules/@capacitor/keyboard"
58
+  CapacitorPreferences:
59
+    :path: "../../node_modules/@capacitor/preferences"
60
+  CapacitorStatusBar:
61
+    :path: "../../node_modules/@capacitor/status-bar"
62
+
63
+SPEC CHECKSUMS:
64
+  Capacitor: 57890b363df14d5d2d5d8461aa23e886cb34da2a
65
+  CapacitorApp: 024e1b1bea5f883d79f6330d309bc441c88ad04a
66
+  CapacitorCommunityFacebookLogin: c0e2bb54cb567d90443a80ae20569fdac0df3f89
67
+  CapacitorCordova: 3d3908a3d208a11a75f9df3b18c4405c4de76e1d
68
+  CapacitorHaptics: 1fffc1217c7e64a472d7845be50fb0c2f7d4204c
69
+  CapacitorKeyboard: b978154b024a5f65e044908e37d15b7de58b9d12
70
+  CapacitorPreferences: f03954bcb0ff09c792909e46bff88e3183c16b10
71
+  CapacitorStatusBar: 565c0a1ebd79bb40d797606a8992b4a105885309
72
+  FBAEMKit: af2972f39bb0f3f7c45998f435b007833c32ffb2
73
+  FBSDKCoreKit: 19e2e18b3be578d7a51fed8fdd8c152bef0b9511
74
+  FBSDKCoreKit_Basics: dd9826ce3c9fd9f8cdf8dbbd0ef0a53e6c0c9e7e
75
+  FBSDKLoginKit: c395c63a1a6cf4a8a1e6103fd94b8c46329ee81c
76
+
77
+PODFILE CHECKSUM: c9736b063f76e0be20a97ef4e5e07cd2323fa896
78
+
79
+COCOAPODS: 1.12.1

File diff suppressed because it is too large
+ 1951 - 159
package-lock.json


+ 14 - 1
package.json

@@ -12,13 +12,26 @@
12 12
     "lint": "eslint"
13 13
   },
14 14
   "dependencies": {
15
+    "@capacitor-community/facebook-login": "^5.0.3",
16
+    "@capacitor/app": "5.0.6",
17
+    "@capacitor/core": "5.5.0",
18
+    "@capacitor/haptics": "5.0.6",
19
+    "@capacitor/ios": "5.5.0",
20
+    "@capacitor/keyboard": "5.0.6",
21
+    "@capacitor/preferences": "^5.0.6",
22
+    "@capacitor/status-bar": "5.0.6",
15 23
     "@ionic/vue": "^7.0.0",
16 24
     "@ionic/vue-router": "^7.0.0",
25
+    "@vimeo/player": "^2.20.1",
26
+    "axios": "^1.6.0",
17 27
     "ionicons": "^7.0.0",
18 28
     "vue": "^3.2.45",
19
-    "vue-router": "^4.1.6"
29
+    "vue-core-video-player": "^0.2.0",
30
+    "vue-router": "^4.1.6",
31
+    "vue-vimeo-player": "^1.1.2"
20 32
   },
21 33
   "devDependencies": {
34
+    "@capacitor/cli": "5.5.0",
22 35
     "@vitejs/plugin-legacy": "^4.0.2",
23 36
     "@vitejs/plugin-vue": "^4.0.0",
24 37
     "@vue/eslint-config-typescript": "^11.0.2",

+ 8 - 1
src/main.ts

@@ -29,4 +29,11 @@ const app = createApp(App)
29 29
   
30 30
 router.isReady().then(() => {
31 31
   app.mount('#app');
32
-});
32
+});
33
+
34
+import { addIcons } from 'ionicons';
35
+import { heart } from 'ionicons/icons';
36
+
37
+addIcons({
38
+  heart: heart,
39
+});

+ 9 - 0
src/router/index.ts

@@ -26,6 +26,15 @@ const routes: Array<RouteRecordRaw> = [
26 26
       {
27 27
         path: 'tab3',
28 28
         component: () => import('@/views/Tab3Page.vue')
29
+      },
30
+      {
31
+        path: 'tab4',
32
+        component: () => import('@/views/ProfilePage.vue')
33
+      },
34
+      {
35
+        path: 'detail/:id/',
36
+        name: 'Detail', 
37
+        component: () => import('@/views/DetailPage.vue')
29 38
       }
30 39
     ]
31 40
   }

+ 65 - 0
src/settings.ts

@@ -0,0 +1,65 @@
1
+import { CapacitorHttp } from '@capacitor/core';
2
+import axios from "axios";
3
+
4
+import { Preferences } from '@capacitor/preferences';
5
+
6
+
7
+export const TOKEN = '173cb9e357a861abd91e8008fab9246e0cc116af'
8
+//export const BASE_URL = 'http://192.168.1.35:8020/'
9
+export const BASE_URL = 'http://localhost:8020/'
10
+export const getProducts = async () => {
11
+  console.log("Get Products")
12
+  const { data } = await axios.get("https://yesno.wtf/api");
13
+  console.log(data)
14
+}
15
+
16
+export const setToken = async () => {
17
+   await Preferences.set({
18
+    key: 'user',
19
+    value: JSON.stringify({
20
+      id: 1,
21
+      name: 'Max'
22
+    })
23
+  });
24
+}
25
+
26
+export const getObject = async () => {
27
+  const ret = await Preferences.get({ key: 'user' });
28
+  const user = JSON.parse(ret.value);
29
+  return user
30
+}
31
+
32
+export const getToken = async () => {
33
+  console.log("get token ")
34
+  const { data } = await axios.post(BASE_URL + "api-token-auth/", {username: 'root', password: 'Tum 1984'})
35
+  console.log("get token ", data)
36
+  await Preferences.set({
37
+    key: 'token', 
38
+    value: data.token
39
+  })
40
+  return data.token
41
+}
42
+
43
+export const getTrainers = async () => {
44
+  const token = await Preferences.get({ key: 'token' });
45
+  console.log("token = ", token)
46
+  const { data } = await axios.get(BASE_URL + "backend/api/trainers/", {
47
+    headers: { 
48
+    'Authorization': `Token ${token.value}`
49
+    }
50
+  })
51
+  console.log(data)
52
+  return data.results
53
+}
54
+export const listMats = async  () => {
55
+
56
+  const token = await Preferences.get({ key: 'token' });
57
+  console.log("token = ", token)
58
+  const { data } = await axios.get(BASE_URL + "backend/api/mats/?ordering=-id", {
59
+    headers: { 
60
+    'Authorization': `Token ${token.value}`
61
+    }
62
+  })
63
+  console.log(data)
64
+  return data.results
65
+}

+ 31 - 0
src/views/DetailPage.vue

@@ -0,0 +1,31 @@
1
+
2
+<template>
3
+  <ion-page>
4
+    <ion-header>
5
+      <ion-toolbar>
6
+        <ion-buttons slot="start">
7
+          <ion-back-button></ion-back-button>
8
+          </ion-buttons>
9
+        <ion-title>Detail</ion-title>
10
+      </ion-toolbar>
11
+    </ion-header>
12
+    <ion-content :fullscreen="true">
13
+      <ion-header collapse="condense">
14
+        <ion-toolbar>
15
+          <ion-title size="large">Detail</ion-title>
16
+        </ion-toolbar>
17
+      </ion-header>
18
+      ID: {{ id }}
19
+    </ion-content>
20
+  </ion-page>
21
+</template>
22
+
23
+<script setup lang="ts">
24
+import { IonPage, IonHeader, IonToolbar, IonTitle, IonContent,   IonNavLink,
25
+    IonButton,
26
+    IonButtons,
27
+    IonBackButton } from '@ionic/vue';
28
+import { useRoute } from 'vue-router';
29
+const route = useRoute();
30
+const { id } = route.params;
31
+</script>

+ 72 - 0
src/views/ProfilePage.vue

@@ -0,0 +1,72 @@
1
+<template>
2
+   <ion-page>
3
+    <ion-header>
4
+      <ion-toolbar>
5
+        <ion-title>Listen now</ion-title>
6
+      </ion-toolbar>
7
+    </ion-header>
8
+    <ion-content>
9
+      <div class="example-content">Listen now content</div>
10
+      <ion-button @click='fbLogout' v-if='isLogin'>Facebook Logout</ion-button>
11
+      <ion-button @click='fbLogin' v-else>Facebook Login</ion-button>
12
+    </ion-content>
13
+  </ion-page>
14
+</template>
15
+
16
+<script setup lang="ts">
17
+import { IonPage, IonHeader, IonToolbar, IonTitle, IonContent, IonButton, onIonViewWillEnter } from '@ionic/vue';
18
+import ExploreContainer from '@/components/ExploreContainer.vue';
19
+
20
+import {
21
+  FacebookLogin,
22
+  FacebookLoginResponse,
23
+} from '@capacitor-community/facebook-login';
24
+
25
+import { ref } from 'vue';
26
+
27
+const FACEBOOK_PERMISSIONS = [
28
+  'email',
29
+  'public_profile',
30
+  //'user_photos',
31
+  //'user_gender',
32
+];
33
+
34
+const isLogin = ref(false)
35
+
36
+const fbLogin = async () => {
37
+  const result = await (<FacebookLoginResponse>(
38
+    FacebookLogin.login({ permissions: FACEBOOK_PERMISSIONS })
39
+  ));
40
+
41
+  if (result.accessToken) {
42
+    // Login successful.
43
+    isLogin.value = true
44
+    console.log(`Facebook access token is ${result.accessToken.token}`);
45
+  }
46
+}
47
+const fbLogout = async () => {
48
+  await FacebookLogin.logout();
49
+  isLogin.value = false
50
+}
51
+onIonViewWillEnter(async () => {
52
+  const result = await (<FacebookLoginResponse>(
53
+    FacebookLogin.getCurrentAccessToken()
54
+  ));
55
+  console.log(result == undefined)
56
+  if (result != undefined && result.accessToken) {
57
+    console.log(`Facebook access token is ${result.accessToken.token}`);
58
+    isLogin.value = true
59
+    await getProfile()
60
+  }else {
61
+    isLogin.value = false
62
+  }
63
+
64
+})
65
+const getProfile = async () => {
66
+  const result = await FacebookLogin.getProfile<{
67
+    email: string;
68
+  }>({ fields: ['email'] });
69
+
70
+  console.log(`Facebook user's email is ${result.email}`);
71
+}
72
+</script>

+ 129 - 4
src/views/Tab1Page.vue

@@ -5,19 +5,144 @@
5 5
         <ion-title>Tab 1</ion-title>
6 6
       </ion-toolbar>
7 7
     </ion-header>
8
-    <ion-content :fullscreen="true">
8
+    <ion-content>
9 9
       <ion-header collapse="condense">
10 10
         <ion-toolbar>
11 11
           <ion-title size="large">Tab 1</ion-title>
12 12
         </ion-toolbar>
13 13
       </ion-header>
14
+      <ion-grid>
15
+        <ion-row>
16
+          <ion-col size="12" size-md="4" size-lg="2">
17
+            <ion-card>
18
+              <img alt="Silhouette of mountains" src="https://ionicframework.com/docs/img/demos/card-media.png" />
19
+              <ion-card-header>
20
+                <ion-card-title>Card Title</ion-card-title>
21
+                <ion-card-subtitle>Card Subtitle</ion-card-subtitle>
22
+              </ion-card-header>
14 23
 
15
-      <ExploreContainer name="Tab 1 page" />
24
+              <ion-card-content>
25
+                Here's a small text description for the card content. Nothing more, nothing less.
26
+              </ion-card-content>
27
+            </ion-card>
28
+          </ion-col>
29
+          <ion-col size="12" size-md="4" size-lg="2">
30
+            <ion-card>
31
+              <img alt="Silhouette of mountains" src="https://ionicframework.com/docs/img/demos/card-media.png" />
32
+              <ion-card-header>
33
+                <ion-card-title>Card Title</ion-card-title>
34
+                <ion-card-subtitle>Card Subtitle</ion-card-subtitle>
35
+              </ion-card-header>
36
+
37
+              <ion-card-content>
38
+                Here's a small text description for the card content. Nothing more, nothing less.
39
+              </ion-card-content>
40
+            </ion-card>
41
+          </ion-col>
42
+        </ion-row>
43
+      </ion-grid>
44
+      {{ token }}
45
+      <ion-button router-link="/tabs/detail/3/" router-direction="forward">Click Me</ion-button>
46
+      {{ safeUrl }}
47
+      
48
+      <div style="padding:56.25% 0 0 0;position:relative;"><iframe src="https://player.vimeo.com/video/880005259?badge=0&amp;autopause=0&amp;quality_selector=1&amp;player_id=0&amp;app_id=58479" frameborder="0" allow="autoplay; fullscreen; picture-in-picture" style="position:absolute;top:0;left:0;width:100%;height:100%;" title="Muay Thai Advance"></iframe></div> 
49
+<!--
50
+<vue-core-video-player src="https://player.vimeo.com/progressive_redirect/playback/880005259/rendition/720p/file.mp4?loc=external&signature=5ddad1430211b33f65824444a3137fc0ec6fe61183d39997036d2dd3b78654f9"></vue-core-video-player> -->
51
+
52
+      Video
53
+
54
+
55
+<div id="made-in-ny" ref='video'></div>
56
+
57
+      <ul>
58
+        <li v-for="(item, index) in items">
59
+          {{ item.msg }}
60
+        </li>
61
+      </ul>
62
+      <ion-item v-for="t in trainers" :router-link="'/detail/'+t.id">
63
+        <ion-thumbnail slot="start" v-if="t.photo">
64
+          <img alt="Silhouette of mountains" :src="t.photo" />
65
+        </ion-thumbnail>
66
+        <ion-label class='ion-text-wrap'>{{ t.name }}</ion-label>
67
+      </ion-item>
68
+      <ion-icon icon="heart"></ion-icon>
69
+      <ion-button @click="scrollToBottom">Scroll to Bottom</ion-button>
70
+      {{ mats }}
16 71
     </ion-content>
17 72
   </ion-page>
18 73
 </template>
19 74
 
20 75
 <script setup lang="ts">
21
-import { IonPage, IonHeader, IonToolbar, IonTitle, IonContent } from '@ionic/vue';
22
-import ExploreContainer from '@/components/ExploreContainer.vue';
76
+
77
+import { IonPage, IonHeader, IonToolbar, IonTitle, IonContent, IonIcon, onIonViewWillEnter, IonButton, 
78
+  onIonViewWillLeave, IonItem, IonLabel, IonThumbnail, IonCol, IonGrid, IonRow, IonCard, IonCardContent, IonCardHeader, IonCardSubtitle, IonCardTitle  } from '@ionic/vue';
79
+import ExploreContainer  from '@/components/ExploreContainer.vue';
80
+import { CapacitorHttp } from '@capacitor/core';
81
+import { ref } from 'vue';
82
+import { TOKEN, getProducts, setToken, getObject, getToken, getTrainers, listMats } from '@/settings';
83
+//import VueCoreVideoPlayer from 'vue-core-video-player'
84
+import { vueVimeoPlayer } from 'vue-vimeo-player'
85
+
86
+
87
+import Player from '@vimeo/player';
88
+
89
+const safeUrl = "https://vimeo.com/880005259?share=copy"
90
+const token = ref()
91
+const trainers = ref([])
92
+const mats = ref()
93
+ const scrollToBottom = () => {
94
+    console.log("scroll")
95
+    //content.value.$el.scrollToBottom(300);
96
+  };
97
+  const items = ref([{msg: 'foo'}, {msg: 'bar2'}])
98
+
99
+  const options = {
100
+        id: 59777392,
101
+        width: 640,
102
+        loop: true
103
+    };
104
+ //const video = ref(null)
105
+
106
+  //const player = new Player(video, options);
107
+
108
+  onIonViewWillEnter(async () => {
109
+    //console.log("video " ,video)
110
+    //console.log("video id", video.value.id)
111
+    //const player = new Player(video.value.id, options);
112
+    //player.setVolume(0);
113
+
114
+    //player.on('play', function() {
115
+    //    console.log('played the video!');
116
+    //});
117
+    console.log("view view enter")
118
+    // doGet()
119
+    // await getProducts()
120
+    // console.log(TOKEN)
121
+    // setToken()
122
+    // let u = getObject()
123
+    //console.log('u ', u)
124
+
125
+    token.value = await getToken()
126
+    trainers.value = await getTrainers()
127
+    mats.value = await listMats()
128
+    console.log(" trainers => ", trainers)
129
+
130
+  })
131
+
132
+  onIonViewWillLeave(() => {
133
+    console.log("view will leave")
134
+  
135
+  })
136
+
137
+  const doGet = async () => {
138
+    console.log("do get")
139
+    const options = {
140
+      url: 'https://example.com/my/api',
141
+      headers: { 'X-Fake-Header': 'Fake-Value' },
142
+      params: { size: 'XL' },
143
+    };
144
+
145
+    const response: HttpResponse = await CapacitorHttp.get(options);
146
+    console.log(response)
147
+  }
23 148
 </script>

+ 12 - 7
src/views/TabsPage.vue

@@ -4,18 +4,22 @@
4 4
       <ion-router-outlet></ion-router-outlet>
5 5
       <ion-tab-bar slot="bottom">
6 6
         <ion-tab-button tab="tab1" href="/tabs/tab1">
7
-          <ion-icon aria-hidden="true" :icon="triangle" />
8
-          <ion-label>Tab 1</ion-label>
7
+          <ion-icon aria-hidden="true" :icon="videocam" />
8
+          <ion-label>Trainings</ion-label>
9 9
         </ion-tab-button>
10 10
 
11 11
         <ion-tab-button tab="tab2" href="/tabs/tab2">
12
-          <ion-icon aria-hidden="true" :icon="ellipse" />
13
-          <ion-label>Tab 2</ion-label>
12
+          <ion-icon aria-hidden="true" :icon="grid" />
13
+          <ion-label>Course</ion-label>
14 14
         </ion-tab-button>
15 15
 
16 16
         <ion-tab-button tab="tab3" href="/tabs/tab3">
17
-          <ion-icon aria-hidden="true" :icon="square" />
18
-          <ion-label>Tab 3</ion-label>
17
+          <ion-icon aria-hidden="true" :icon="time" />
18
+          <ion-label>Schedule</ion-label>
19
+        </ion-tab-button>
20
+        <ion-tab-button tab="profile" href="/tabs/tab4">
21
+          <ion-icon aria-hidden="true" :icon="person" />
22
+          <ion-label>Profile</ion-label>
19 23
         </ion-tab-button>
20 24
       </ion-tab-bar>
21 25
     </ion-tabs>
@@ -24,5 +28,6 @@
24 28
 
25 29
 <script setup lang="ts">
26 30
 import { IonTabBar, IonTabButton, IonTabs, IonLabel, IonIcon, IonPage, IonRouterOutlet } from '@ionic/vue';
27
-import { ellipse, square, triangle } from 'ionicons/icons';
31
+import { ellipse, square, triangle, person, time, videocam, grid } from 'ionicons/icons';
32
+
28 33
 </script>

tum/whitesports - Gogs: Simplico Git Service

Nav apraksta

class.wp-scripts.php 18KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718
  1. <?php
  2. /**
  3. * Dependencies API: WP_Scripts class
  4. *
  5. * @since 2.6.0
  6. *
  7. * @package WordPress
  8. * @subpackage Dependencies
  9. */
  10. /**
  11. * Core class used to register scripts.
  12. *
  13. * @since 2.1.0
  14. *
  15. * @see WP_Dependencies
  16. */
  17. class WP_Scripts extends WP_Dependencies {
  18. /**
  19. * Base URL for scripts.
  20. *
  21. * Full URL with trailing slash.
  22. *
  23. * @since 2.6.0
  24. * @var string
  25. */
  26. public $base_url;
  27. /**
  28. * URL of the content directory.
  29. *
  30. * @since 2.8.0
  31. * @var string
  32. */
  33. public $content_url;
  34. /**
  35. * Default version string for scripts.
  36. *
  37. * @since 2.6.0
  38. * @var string
  39. */
  40. public $default_version;
  41. /**
  42. * Holds handles of scripts which are enqueued in footer.
  43. *
  44. * @since 2.8.0
  45. * @var array
  46. */
  47. public $in_footer = array();
  48. /**
  49. * Holds a list of script handles which will be concatenated.
  50. *
  51. * @since 2.8.0
  52. * @var string
  53. */
  54. public $concat = '';
  55. /**
  56. * Holds a string which contains script handles and their version.
  57. *
  58. * @since 2.8.0
  59. * @deprecated 3.4.0
  60. * @var string
  61. */
  62. public $concat_version = '';
  63. /**
  64. * Whether to perform concatenation.
  65. *
  66. * @since 2.8.0
  67. * @var bool
  68. */
  69. public $do_concat = false;
  70. /**
  71. * Holds HTML markup of scripts and additional data if concatenation
  72. * is enabled.
  73. *
  74. * @since 2.8.0
  75. * @var string
  76. */
  77. public $print_html = '';
  78. /**
  79. * Holds inline code if concatenation is enabled.
  80. *
  81. * @since 2.8.0
  82. * @var string
  83. */
  84. public $print_code = '';
  85. /**
  86. * Holds a list of script handles which are not in the default directory
  87. * if concatenation is enabled.
  88. *
  89. * Unused in core.
  90. *
  91. * @since 2.8.0
  92. * @var string
  93. */
  94. public $ext_handles = '';
  95. /**
  96. * Holds a string which contains handles and versions of scripts which
  97. * are not in the default directory if concatenation is enabled.
  98. *
  99. * Unused in core.
  100. *
  101. * @since 2.8.0
  102. * @var string
  103. */
  104. public $ext_version = '';
  105. /**
  106. * List of default directories.
  107. *
  108. * @since 2.8.0
  109. * @var array
  110. */
  111. public $default_dirs;
  112. /**
  113. * Holds a string which contains the type attribute for script tag.
  114. *
  115. * If the current theme does not declare HTML5 support for 'script',
  116. * then it initializes as `type='text/javascript'`.
  117. *
  118. * @since 5.3.0
  119. * @var string
  120. */
  121. private $type_attr = '';
  122. /**
  123. * Constructor.
  124. *
  125. * @since 2.6.0
  126. */
  127. public function __construct() {
  128. $this->init();
  129. add_action( 'init', array( $this, 'init' ), 0 );
  130. }
  131. /**
  132. * Initialize the class.
  133. *
  134. * @since 3.4.0
  135. */
  136. public function init() {
  137. if (
  138. function_exists( 'is_admin' ) && ! is_admin()
  139. &&
  140. function_exists( 'current_theme_supports' ) && ! current_theme_supports( 'html5', 'script' )
  141. ) {
  142. $this->type_attr = " type='text/javascript'";
  143. }
  144. /**
  145. * Fires when the WP_Scripts instance is initialized.
  146. *
  147. * @since 2.6.0
  148. *
  149. * @param WP_Scripts $this WP_Scripts instance (passed by reference).
  150. */
  151. do_action_ref_array( 'wp_default_scripts', array( &$this ) );
  152. }
  153. /**
  154. * Prints scripts.
  155. *
  156. * Prints the scripts passed to it or the print queue. Also prints all necessary dependencies.
  157. *
  158. * @since 2.1.0
  159. * @since 2.8.0 Added the `$group` parameter.
  160. *
  161. * @param string|string[]|false $handles Optional. Scripts to be printed: queue (false),
  162. * single script (string), or multiple scripts (array of strings).
  163. * Default false.
  164. * @param int|false $group Optional. Group level: level (int), no groups (false).
  165. * Default false.
  166. * @return string[] Handles of scripts that have been printed.
  167. */
  168. public function print_scripts( $handles = false, $group = false ) {
  169. return $this->do_items( $handles, $group );
  170. }
  171. /**
  172. * Prints extra scripts of a registered script.
  173. *
  174. * @since 2.1.0
  175. * @since 2.8.0 Added the `$echo` parameter.
  176. * @deprecated 3.3.0
  177. *
  178. * @see print_extra_script()
  179. *
  180. * @param string $handle The script's registered handle.
  181. * @param bool $echo Optional. Whether to echo the extra script
  182. * instead of just returning it. Default true.
  183. * @return bool|string|void Void if no data exists, extra scripts if `$echo` is true,
  184. * true otherwise.
  185. */
  186. public function print_scripts_l10n( $handle, $echo = true ) {
  187. _deprecated_function( __FUNCTION__, '3.3.0', 'WP_Scripts::print_extra_script()' );
  188. return $this->print_extra_script( $handle, $echo );
  189. }
  190. /**
  191. * Prints extra scripts of a registered script.
  192. *
  193. * @since 3.3.0
  194. *
  195. * @param string $handle The script's registered handle.
  196. * @param bool $echo Optional. Whether to echo the extra script
  197. * instead of just returning it. Default true.
  198. * @return bool|string|void Void if no data exists, extra scripts if `$echo` is true,
  199. * true otherwise.
  200. */
  201. public function print_extra_script( $handle, $echo = true ) {
  202. $output = $this->get_data( $handle, 'data' );
  203. if ( ! $output ) {
  204. return;
  205. }
  206. if ( ! $echo ) {
  207. return $output;
  208. }
  209. printf( "<script%s id='%s-js-extra'>\n", $this->type_attr, esc_attr( $handle ) );
  210. // CDATA is not needed for HTML 5.
  211. if ( $this->type_attr ) {
  212. echo "/* <![CDATA[ */\n";
  213. }
  214. echo "$output\n";
  215. if ( $this->type_attr ) {
  216. echo "/* ]]> */\n";
  217. }
  218. echo "</script>\n";
  219. return true;
  220. }
  221. /**
  222. * Processes a script dependency.
  223. *
  224. * @since 2.6.0
  225. * @since 2.8.0 Added the `$group` parameter.
  226. *
  227. * @see WP_Dependencies::do_item()
  228. *
  229. * @param string $handle The script's registered handle.
  230. * @param int|false $group Optional. Group level: level (int), no groups (false).
  231. * Default false.
  232. * @return bool True on success, false on failure.
  233. */
  234. public function do_item( $handle, $group = false ) {
  235. if ( ! parent::do_item( $handle ) ) {
  236. return false;
  237. }
  238. if ( 0 === $group && $this->groups[ $handle ] > 0 ) {
  239. $this->in_footer[] = $handle;
  240. return false;
  241. }
  242. if ( false === $group && in_array( $handle, $this->in_footer, true ) ) {
  243. $this->in_footer = array_diff( $this->in_footer, (array) $handle );
  244. }
  245. $obj = $this->registered[ $handle ];
  246. if ( null === $obj->ver ) {
  247. $ver = '';
  248. } else {
  249. $ver = $obj->ver ? $obj->ver : $this->default_version;
  250. }
  251. if ( isset( $this->args[ $handle ] ) ) {
  252. $ver = $ver ? $ver . '&amp;' . $this->args[ $handle ] : $this->args[ $handle ];
  253. }
  254. $src = $obj->src;
  255. $cond_before = '';
  256. $cond_after = '';
  257. $conditional = isset( $obj->extra['conditional'] ) ? $obj->extra['conditional'] : '';
  258. if ( $conditional ) {
  259. $cond_before = "<!--[if {$conditional}]>\n";
  260. $cond_after = "<![endif]-->\n";
  261. }
  262. $before_handle = $this->print_inline_script( $handle, 'before', false );
  263. $after_handle = $this->print_inline_script( $handle, 'after', false );
  264. if ( $before_handle ) {
  265. $before_handle = sprintf( "<script%s id='%s-js-before'>\n%s\n</script>\n", $this->type_attr, esc_attr( $handle ), $before_handle );
  266. }
  267. if ( $after_handle ) {
  268. $after_handle = sprintf( "<script%s id='%s-js-after'>\n%s\n</script>\n", $this->type_attr, esc_attr( $handle ), $after_handle );
  269. }
  270. if ( $before_handle || $after_handle ) {
  271. $inline_script_tag = $cond_before . $before_handle . $after_handle . $cond_after;
  272. } else {
  273. $inline_script_tag = '';
  274. }
  275. $translations = $this->print_translations( $handle, false );
  276. if ( $translations ) {
  277. $translations = sprintf( "<script%s id='%s-js-translations'>\n%s\n</script>\n", $this->type_attr, esc_attr( $handle ), $translations );
  278. }
  279. if ( $this->do_concat ) {
  280. /**
  281. * Filters the script loader source.
  282. *
  283. * @since 2.2.0
  284. *
  285. * @param string $src Script loader source path.
  286. * @param string $handle Script handle.
  287. */
  288. $srce = apply_filters( 'script_loader_src', $src, $handle );
  289. if ( $this->in_default_dir( $srce ) && ( $before_handle || $after_handle || $translations ) ) {
  290. $this->do_concat = false;
  291. // Have to print the so-far concatenated scripts right away to maintain the right order.
  292. _print_scripts();
  293. $this->reset();
  294. } elseif ( $this->in_default_dir( $srce ) && ! $conditional ) {
  295. $this->print_code .= $this->print_extra_script( $handle, false );
  296. $this->concat .= "$handle,";
  297. $this->concat_version .= "$handle$ver";
  298. return true;
  299. } else {
  300. $this->ext_handles .= "$handle,";
  301. $this->ext_version .= "$handle$ver";
  302. }
  303. }
  304. $has_conditional_data = $conditional && $this->get_data( $handle, 'data' );
  305. if ( $has_conditional_data ) {
  306. echo $cond_before;
  307. }
  308. $this->print_extra_script( $handle );
  309. if ( $has_conditional_data ) {
  310. echo $cond_after;
  311. }
  312. // A single item may alias a set of items, by having dependencies, but no source.
  313. if ( ! $src ) {
  314. if ( $inline_script_tag ) {
  315. if ( $this->do_concat ) {
  316. $this->print_html .= $inline_script_tag;
  317. } else {
  318. echo $inline_script_tag;
  319. }
  320. }
  321. return true;
  322. }
  323. if ( ! preg_match( '|^(https?:)?//|', $src ) && ! ( $this->content_url && 0 === strpos( $src, $this->content_url ) ) ) {
  324. $src = $this->base_url . $src;
  325. }
  326. if ( ! empty( $ver ) ) {
  327. $src = add_query_arg( 'ver', $ver, $src );
  328. }
  329. /** This filter is documented in wp-includes/class.wp-scripts.php */
  330. $src = esc_url( apply_filters( 'script_loader_src', $src, $handle ) );
  331. if ( ! $src ) {
  332. return true;
  333. }
  334. $tag = $translations . $cond_before . $before_handle;
  335. $tag .= sprintf( "<script%s src='%s' id='%s-js'></script>\n", $this->type_attr, $src, esc_attr( $handle ) );
  336. $tag .= $after_handle . $cond_after;
  337. /**
  338. * Filters the HTML script tag of an enqueued script.
  339. *
  340. * @since 4.1.0
  341. *
  342. * @param string $tag The `<script>` tag for the enqueued script.
  343. * @param string $handle The script's registered handle.
  344. * @param string $src The script's source URL.
  345. */
  346. $tag = apply_filters( 'script_loader_tag', $tag, $handle, $src );
  347. if ( $this->do_concat ) {
  348. $this->print_html .= $tag;
  349. } else {
  350. echo $tag;
  351. }
  352. return true;
  353. }
  354. /**
  355. * Adds extra code to a registered script.
  356. *
  357. * @since 4.5.0
  358. *
  359. * @param string $handle Name of the script to add the inline script to.
  360. * Must be lowercase.
  361. * @param string $data String containing the JavaScript to be added.
  362. * @param string $position Optional. Whether to add the inline script
  363. * before the handle or after. Default 'after'.
  364. * @return bool True on success, false on failure.
  365. */
  366. public function add_inline_script( $handle, $data, $position = 'after' ) {
  367. if ( ! $data ) {
  368. return false;
  369. }
  370. if ( 'after' !== $position ) {
  371. $position = 'before';
  372. }
  373. $script = (array) $this->get_data( $handle, $position );
  374. $script[] = $data;
  375. return $this->add_data( $handle, $position, $script );
  376. }
  377. /**
  378. * Prints inline scripts registered for a specific handle.
  379. *
  380. * @since 4.5.0
  381. *
  382. * @param string $handle Name of the script to add the inline script to.
  383. * Must be lowercase.
  384. * @param string $position Optional. Whether to add the inline script
  385. * before the handle or after. Default 'after'.
  386. * @param bool $echo Optional. Whether to echo the script
  387. * instead of just returning it. Default true.
  388. * @return string|false Script on success, false otherwise.
  389. */
  390. public function print_inline_script( $handle, $position = 'after', $echo = true ) {
  391. $output = $this->get_data( $handle, $position );
  392. if ( empty( $output ) ) {
  393. return false;
  394. }
  395. $output = trim( implode( "\n", $output ), "\n" );
  396. if ( $echo ) {
  397. printf( "<script%s id='%s-js-%s'>\n%s\n</script>\n", $this->type_attr, esc_attr( $handle ), esc_attr( $position ), $output );
  398. }
  399. return $output;
  400. }
  401. /**
  402. * Localizes a script, only if the script has already been added.
  403. *
  404. * @since 2.1.0
  405. *
  406. * @param string $handle Name of the script to attach data to.
  407. * @param string $object_name Name of the variable that will contain the data.
  408. * @param array $l10n Array of data to localize.
  409. * @return bool True on success, false on failure.
  410. */
  411. public function localize( $handle, $object_name, $l10n ) {
  412. if ( 'jquery' === $handle ) {
  413. $handle = 'jquery-core';
  414. }
  415. if ( is_array( $l10n ) && isset( $l10n['l10n_print_after'] ) ) { // back compat, preserve the code in 'l10n_print_after' if present.
  416. $after = $l10n['l10n_print_after'];
  417. unset( $l10n['l10n_print_after'] );
  418. }
  419. if ( ! is_array( $l10n ) ) {
  420. _doing_it_wrong(
  421. __METHOD__,
  422. sprintf(
  423. /* translators: 1: $l10n, 2: wp_add_inline_script() */
  424. __( 'The %1$s parameter must be an array. To pass arbitrary data to scripts, use the %2$s function instead.' ),
  425. '<code>$l10n</code>',
  426. '<code>wp_add_inline_script()</code>'
  427. ),
  428. '5.7.0'
  429. );
  430. }
  431. if ( is_string( $l10n ) ) {
  432. $l10n = html_entity_decode( $l10n, ENT_QUOTES, 'UTF-8' );
  433. } else {
  434. foreach ( (array) $l10n as $key => $value ) {
  435. if ( ! is_scalar( $value ) ) {
  436. continue;
  437. }
  438. $l10n[ $key ] = html_entity_decode( (string) $value, ENT_QUOTES, 'UTF-8' );
  439. }
  440. }
  441. $script = "var $object_name = " . wp_json_encode( $l10n ) . ';';
  442. if ( ! empty( $after ) ) {
  443. $script .= "\n$after;";
  444. }
  445. $data = $this->get_data( $handle, 'data' );
  446. if ( ! empty( $data ) ) {
  447. $script = "$data\n$script";
  448. }
  449. return $this->add_data( $handle, 'data', $script );
  450. }
  451. /**
  452. * Sets handle group.
  453. *
  454. * @since 2.8.0
  455. *
  456. * @see WP_Dependencies::set_group()
  457. *
  458. * @param string $handle Name of the item. Should be unique.
  459. * @param bool $recursion Internal flag that calling function was called recursively.
  460. * @param int|false $group Optional. Group level: level (int), no groups (false).
  461. * Default false.
  462. * @return bool Not already in the group or a lower group.
  463. */
  464. public function set_group( $handle, $recursion, $group = false ) {
  465. if ( isset( $this->registered[ $handle ]->args ) && 1 === $this->registered[ $handle ]->args ) {
  466. $grp = 1;
  467. } else {
  468. $grp = (int) $this->get_data( $handle, 'group' );
  469. }
  470. if ( false !== $group && $grp > $group ) {
  471. $grp = $group;
  472. }
  473. return parent::set_group( $handle, $recursion, $grp );
  474. }
  475. /**
  476. * Sets a translation textdomain.
  477. *
  478. * @since 5.0.0
  479. * @since 5.1.0 The `$domain` parameter was made optional.
  480. *
  481. * @param string $handle Name of the script to register a translation domain to.
  482. * @param string $domain Optional. Text domain. Default 'default'.
  483. * @param string $path Optional. The full file path to the directory containing translation files.
  484. * @return bool True if the text domain was registered, false if not.
  485. */
  486. public function set_translations( $handle, $domain = 'default', $path = null ) {
  487. if ( ! isset( $this->registered[ $handle ] ) ) {
  488. return false;
  489. }
  490. /** @var \_WP_Dependency $obj */
  491. $obj = $this->registered[ $handle ];
  492. if ( ! in_array( 'wp-i18n', $obj->deps, true ) ) {
  493. $obj->deps[] = 'wp-i18n';
  494. }
  495. return $obj->set_translations( $domain, $path );
  496. }
  497. /**
  498. * Prints translations set for a specific handle.
  499. *
  500. * @since 5.0.0
  501. *
  502. * @param string $handle Name of the script to add the inline script to.
  503. * Must be lowercase.
  504. * @param bool $echo Optional. Whether to echo the script
  505. * instead of just returning it. Default true.
  506. * @return string|false Script on success, false otherwise.
  507. */
  508. public function print_translations( $handle, $echo = true ) {
  509. if ( ! isset( $this->registered[ $handle ] ) || empty( $this->registered[ $handle ]->textdomain ) ) {
  510. return false;
  511. }
  512. $domain = $this->registered[ $handle ]->textdomain;
  513. $path = $this->registered[ $handle ]->translations_path;
  514. $json_translations = load_script_textdomain( $handle, $domain, $path );
  515. if ( ! $json_translations ) {
  516. // Register empty locale data object to ensure the domain still exists.
  517. $json_translations = '{ "locale_data": { "messages": { "": {} } } }';
  518. }
  519. $output = <<<JS
  520. ( function( domain, translations ) {
  521. var localeData = translations.locale_data[ domain ] || translations.locale_data.messages;
  522. localeData[""].domain = domain;
  523. wp.i18n.setLocaleData( localeData, domain );
  524. } )( "{$domain}", {$json_translations} );
  525. JS;
  526. if ( $echo ) {
  527. printf( "<script%s id='%s-js-translations'>\n%s\n</script>\n", $this->type_attr, esc_attr( $handle ), $output );
  528. }
  529. return $output;
  530. }
  531. /**
  532. * Determines script dependencies.
  533. *
  534. * @since 2.1.0
  535. *
  536. * @see WP_Dependencies::all_deps()
  537. *
  538. * @param string|string[] $handles Item handle (string) or item handles (array of strings).
  539. * @param bool $recursion Optional. Internal flag that function is calling itself.
  540. * Default false.
  541. * @param int|false $group Optional. Group level: level (int), no groups (false).
  542. * Default false.
  543. * @return bool True on success, false on failure.
  544. */
  545. public function all_deps( $handles, $recursion = false, $group = false ) {
  546. $r = parent::all_deps( $handles, $recursion, $group );
  547. if ( ! $recursion ) {
  548. /**
  549. * Filters the list of script dependencies left to print.
  550. *
  551. * @since 2.3.0
  552. *
  553. * @param string[] $to_do An array of script dependency handles.
  554. */
  555. $this->to_do = apply_filters( 'print_scripts_array', $this->to_do );
  556. }
  557. return $r;
  558. }
  559. /**
  560. * Processes items and dependencies for the head group.
  561. *
  562. * @since 2.8.0
  563. *
  564. * @see WP_Dependencies::do_items()
  565. *
  566. * @return string[] Handles of items that have been processed.
  567. */
  568. public function do_head_items() {
  569. $this->do_items( false, 0 );
  570. return $this->done;
  571. }
  572. /**
  573. * Processes items and dependencies for the footer group.
  574. *
  575. * @since 2.8.0
  576. *
  577. * @see WP_Dependencies::do_items()
  578. *
  579. * @return string[] Handles of items that have been processed.
  580. */
  581. public function do_footer_items() {
  582. $this->do_items( false, 1 );
  583. return $this->done;
  584. }
  585. /**
  586. * Whether a handle's source is in a default directory.
  587. *
  588. * @since 2.8.0
  589. *
  590. * @param string $src The source of the enqueued script.
  591. * @return bool True if found, false if not.
  592. */
  593. public function in_default_dir( $src ) {
  594. if ( ! $this->default_dirs ) {
  595. return true;
  596. }
  597. if ( 0 === strpos( $src, '/' . WPINC . '/js/l10n' ) ) {
  598. return false;
  599. }
  600. foreach ( (array) $this->default_dirs as $test ) {
  601. if ( 0 === strpos( $src, $test ) ) {
  602. return true;
  603. }
  604. }
  605. return false;
  606. }
  607. /**
  608. * Resets class properties.
  609. *
  610. * @since 2.8.0
  611. */
  612. public function reset() {
  613. $this->do_concat = false;
  614. $this->print_code = '';
  615. $this->concat = '';
  616. $this->concat_version = '';
  617. $this->print_html = '';
  618. $this->ext_version = '';
  619. $this->ext_handles = '';
  620. }
  621. }