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

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

@@ -1,7 +0,0 @@
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>

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

@@ -1,10 +0,0 @@
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>

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

@@ -1,8 +0,0 @@
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>

+ 0 - 8
ios/App/App/App.entitlements

@@ -1,8 +0,0 @@
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>aps-environment</key>
6
-	<string>development</string>
7
-</dict>
8
-</plist>

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

@@ -1,80 +0,0 @@
1
-import UIKit
2
-import Capacitor
3
-import FBSDKCoreKit
4
-import Firebase
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
-        FirebaseApp.configure()
15
-        return true
16
-    }
17
-
18
-    func applicationWillResignActive(_ application: UIApplication) {
19
-        // 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.
20
-        // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game.
21
-    }
22
-
23
-    func applicationDidEnterBackground(_ application: UIApplication) {
24
-        // 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.
25
-        // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
26
-    }
27
-
28
-    func applicationWillEnterForeground(_ application: UIApplication) {
29
-        // 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.
30
-    }
31
-
32
-    func applicationDidBecomeActive(_ application: UIApplication) {
33
-        // 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.
34
-    }
35
-
36
-    func applicationWillTerminate(_ application: UIApplication) {
37
-        // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
38
-    }
39
-
40
-    func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool {
41
-        // Called when the app was launched with a url. Feel free to add additional processing here,
42
-        // but if you want the App API to support tracking app url opens, make sure to keep this call
43
-        //return ApplicationDelegateProxy.shared.application(app, open: url, options: options)
44
-        
45
-        if (FBSDKCoreKit.ApplicationDelegate.shared.application(
46
-                    app,
47
-                    open: url,
48
-                    sourceApplication: options[UIApplication.OpenURLOptionsKey.sourceApplication] as? String,
49
-                    annotation: options[UIApplication.OpenURLOptionsKey.annotation]
50
-                )) {
51
-                    return true;
52
-                } else {
53
-                    return ApplicationDelegateProxy.shared.application(app, open: url, options: options)
54
-                }
55
-    }
56
-
57
-    func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
58
-        // Called when the app was launched with an activity, including Universal Links.
59
-        // Feel free to add additional processing here, but if you want the App API to support
60
-        // tracking app url opens, make sure to keep this call
61
-        return ApplicationDelegateProxy.shared.application(application, continue: userActivity, restorationHandler: restorationHandler)
62
-    }
63
-    func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
64
-      NotificationCenter.default.post(name: .capacitorDidRegisterForRemoteNotifications, object: deviceToken)
65
-        Messaging.messaging().apnsToken = deviceToken
66
-        Messaging.messaging().token(completion: { (token, error) in
67
-             if let error = error {
68
-                 NotificationCenter.default.post(name: .capacitorDidFailToRegisterForRemoteNotifications, object: error)
69
-             } else if let token = token {
70
-                 NotificationCenter.default.post(name: .capacitorDidRegisterForRemoteNotifications, object: token)
71
-             }
72
-        })
73
-    }
74
-
75
-    func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
76
-      NotificationCenter.default.post(name: .capacitorDidFailToRegisterForRemoteNotifications, object: error)
77
-    
78
-    }
79
-
80
-}

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


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

@@ -1,14 +0,0 @@
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
-}

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

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

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

@@ -1,23 +0,0 @@
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


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

@@ -1,32 +0,0 @@
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>

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

@@ -1,19 +0,0 @@
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>

+ 0 - 38
ios/App/App/GoogleService-Info.plist

@@ -1,38 +0,0 @@
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>CLIENT_ID</key>
6
-	<string>496323526366-khm7rkn7rthnauaailuth9sdid4of8d8.apps.googleusercontent.com</string>
7
-	<key>REVERSED_CLIENT_ID</key>
8
-	<string>com.googleusercontent.apps.496323526366-khm7rkn7rthnauaailuth9sdid4of8d8</string>
9
-	<key>PLIST_VERSION</key>
10
-	<string>1</string>
11
-	<key>BUNDLE_ID</key>
12
-	<string>net.simplico.tmtlive</string>
13
-    <key>API_KEY</key>
14
-    <string>AIzaSyCEy_bLCJITwxRi-5vsiyArQM5oow5NAgk</string>
15
-    <key>GCM_SENDER_ID</key>
16
-    <string>214019008700</string>
17
-    <key>PLIST_VERSION</key>
18
-    <string>1</string>
19
-    <key>BUNDLE_ID</key>
20
-    <string>net.simplico.tmtlive</string>
21
-    <key>PROJECT_ID</key>
22
-    <string>tmtlive-557ac</string>
23
-    <key>STORAGE_BUCKET</key>
24
-    <string>tmtlive-557ac.appspot.com</string>
25
-    <key>IS_ADS_ENABLED</key>
26
-    <false></false>
27
-    <key>IS_ANALYTICS_ENABLED</key>
28
-    <false></false>
29
-    <key>IS_APPINVITE_ENABLED</key>
30
-    <true></true>
31
-    <key>IS_GCM_ENABLED</key>
32
-    <true></true>
33
-    <key>IS_SIGNIN_ENABLED</key>
34
-    <true></true>
35
-    <key>GOOGLE_APP_ID</key>
36
-    <string>1:214019008700:ios:be7fb5f07aeed695c088b9</string>
37
-</dict>
38
-</plist>

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

@@ -1,91 +0,0 @@
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
-    <dict>
57
-			<key>CFBundleURLName</key>
58
-			<string>net.simplico.tmtlive</string>
59
-			<key>CFBundleURLSchemes</key>
60
-			<array>
61
-				<string>tmtlive</string>
62
-				<string>com.googleusercontent.apps.496323526366-khm7rkn7rthnauaailuth9sdid4of8d8</string>
63
-			</array>
64
-		</dict>
65
-  </array>
66
-  <key>FacebookAppID</key>
67
-  <string>200395709360570</string>
68
-  <key>FacebookClientToken</key>
69
-  <string>a3ae16e80d605bab9483feaa4c523e84</string>
70
-  <key>FacebookDisplayName</key>
71
-  <string>tigermuaythai.live</string>
72
-  <key>LSApplicationQueriesSchemes</key>
73
-  <array>
74
-    <string>fbapi</string>
75
-    <string>fbapi20130214</string>
76
-    <string>fbapi20130410</string>
77
-    <string>fbapi20130702</string>
78
-    <string>fbapi20131010</string>
79
-    <string>fbapi20131219</string>
80
-    <string>fbapi20140410</string>
81
-    <string>fbapi20140116</string>
82
-    <string>fbapi20150313</string>
83
-    <string>fbapi20150629</string>
84
-    <string>fbapi20160328</string>
85
-    <string>fbauth</string>
86
-    <string>fb-messenger-share-api</string>
87
-    <string>fbauth2</string>
88
-    <string>fbshareextension</string>
89
-  </array>
90
-</dict>
91
-</plist>

Разница между файлами не показана из-за своего большого размера
+ 0 - 13
ios/App/App/google-services.json


+ 0 - 34
ios/App/Podfile

@@ -1,34 +0,0 @@
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 'CapacitorPushNotifications', :path => '../../node_modules/@capacitor/push-notifications'
20
-  pod 'CapacitorShare', :path => '../../node_modules/@capacitor/share'
21
-  pod 'CapacitorStatusBar', :path => '../../node_modules/@capacitor/status-bar'
22
-  pod 'CapgoInappbrowser', :path => '../../node_modules/@capgo/inappbrowser'
23
-  pod 'CodetrixStudioCapacitorGoogleAuth', :path => '../../node_modules/@codetrix-studio/capacitor-google-auth'
24
-end
25
-
26
-target 'App' do
27
-  capacitor_pods
28
-  # Add your Pods here
29
-  pod 'Firebase/Messaging' # Add this line
30
-end
31
-
32
-post_install do |installer|
33
-  assertDeploymentTarget(installer)
34
-end

+ 0 - 197
ios/App/Podfile.lock

@@ -1,197 +0,0 @@
1
-PODS:
2
-  - AppAuth (1.6.2):
3
-    - AppAuth/Core (= 1.6.2)
4
-    - AppAuth/ExternalUserAgent (= 1.6.2)
5
-  - AppAuth/Core (1.6.2)
6
-  - AppAuth/ExternalUserAgent (1.6.2):
7
-    - AppAuth/Core
8
-  - Capacitor (5.5.0):
9
-    - CapacitorCordova
10
-  - CapacitorApp (5.0.6):
11
-    - Capacitor
12
-  - CapacitorCommunityFacebookLogin (5.0.3):
13
-    - Capacitor
14
-    - FBSDKCoreKit (= 16.1.3)
15
-    - FBSDKLoginKit (= 16.1.3)
16
-  - CapacitorCordova (5.5.0)
17
-  - CapacitorHaptics (5.0.6):
18
-    - Capacitor
19
-  - CapacitorKeyboard (5.0.6):
20
-    - Capacitor
21
-  - CapacitorPreferences (5.0.6):
22
-    - Capacitor
23
-  - CapacitorPushNotifications (5.1.0):
24
-    - Capacitor
25
-  - CapacitorShare (5.0.6):
26
-    - Capacitor
27
-  - CapacitorStatusBar (5.0.6):
28
-    - Capacitor
29
-  - CapgoInappbrowser (1.2.19):
30
-    - Capacitor
31
-  - CodetrixStudioCapacitorGoogleAuth (0.0.1):
32
-    - Capacitor
33
-    - GoogleSignIn (~> 6.2.4)
34
-  - FBAEMKit (16.1.3):
35
-    - FBSDKCoreKit_Basics (= 16.1.3)
36
-  - FBSDKCoreKit (16.1.3):
37
-    - FBAEMKit (= 16.1.3)
38
-    - FBSDKCoreKit_Basics (= 16.1.3)
39
-  - FBSDKCoreKit_Basics (16.1.3)
40
-  - FBSDKLoginKit (16.1.3):
41
-    - FBSDKCoreKit (= 16.1.3)
42
-  - Firebase/CoreOnly (10.17.0):
43
-    - FirebaseCore (= 10.17.0)
44
-  - Firebase/Messaging (10.17.0):
45
-    - Firebase/CoreOnly
46
-    - FirebaseMessaging (~> 10.17.0)
47
-  - FirebaseCore (10.17.0):
48
-    - FirebaseCoreInternal (~> 10.0)
49
-    - GoogleUtilities/Environment (~> 7.8)
50
-    - GoogleUtilities/Logger (~> 7.8)
51
-  - FirebaseCoreInternal (10.17.0):
52
-    - "GoogleUtilities/NSData+zlib (~> 7.8)"
53
-  - FirebaseInstallations (10.17.0):
54
-    - FirebaseCore (~> 10.0)
55
-    - GoogleUtilities/Environment (~> 7.8)
56
-    - GoogleUtilities/UserDefaults (~> 7.8)
57
-    - PromisesObjC (~> 2.1)
58
-  - FirebaseMessaging (10.17.0):
59
-    - FirebaseCore (~> 10.0)
60
-    - FirebaseInstallations (~> 10.0)
61
-    - GoogleDataTransport (~> 9.2)
62
-    - GoogleUtilities/AppDelegateSwizzler (~> 7.8)
63
-    - GoogleUtilities/Environment (~> 7.8)
64
-    - GoogleUtilities/Reachability (~> 7.8)
65
-    - GoogleUtilities/UserDefaults (~> 7.8)
66
-    - nanopb (< 2.30910.0, >= 2.30908.0)
67
-  - GoogleDataTransport (9.2.5):
68
-    - GoogleUtilities/Environment (~> 7.7)
69
-    - nanopb (< 2.30910.0, >= 2.30908.0)
70
-    - PromisesObjC (< 3.0, >= 1.2)
71
-  - GoogleSignIn (6.2.4):
72
-    - AppAuth (~> 1.5)
73
-    - GTMAppAuth (~> 1.3)
74
-    - GTMSessionFetcher/Core (< 3.0, >= 1.1)
75
-  - GoogleUtilities/AppDelegateSwizzler (7.11.6):
76
-    - GoogleUtilities/Environment
77
-    - GoogleUtilities/Logger
78
-    - GoogleUtilities/Network
79
-  - GoogleUtilities/Environment (7.11.6):
80
-    - PromisesObjC (< 3.0, >= 1.2)
81
-  - GoogleUtilities/Logger (7.11.6):
82
-    - GoogleUtilities/Environment
83
-  - GoogleUtilities/Network (7.11.6):
84
-    - GoogleUtilities/Logger
85
-    - "GoogleUtilities/NSData+zlib"
86
-    - GoogleUtilities/Reachability
87
-  - "GoogleUtilities/NSData+zlib (7.11.6)"
88
-  - GoogleUtilities/Reachability (7.11.6):
89
-    - GoogleUtilities/Logger
90
-  - GoogleUtilities/UserDefaults (7.11.6):
91
-    - GoogleUtilities/Logger
92
-  - GTMAppAuth (1.3.1):
93
-    - AppAuth/Core (~> 1.6)
94
-    - GTMSessionFetcher/Core (< 3.0, >= 1.5)
95
-  - GTMSessionFetcher/Core (2.3.0)
96
-  - nanopb (2.30909.1):
97
-    - nanopb/decode (= 2.30909.1)
98
-    - nanopb/encode (= 2.30909.1)
99
-  - nanopb/decode (2.30909.1)
100
-  - nanopb/encode (2.30909.1)
101
-  - PromisesObjC (2.3.1)
102
-
103
-DEPENDENCIES:
104
-  - "Capacitor (from `../../node_modules/@capacitor/ios`)"
105
-  - "CapacitorApp (from `../../node_modules/@capacitor/app`)"
106
-  - "CapacitorCommunityFacebookLogin (from `../../node_modules/@capacitor-community/facebook-login`)"
107
-  - "CapacitorCordova (from `../../node_modules/@capacitor/ios`)"
108
-  - "CapacitorHaptics (from `../../node_modules/@capacitor/haptics`)"
109
-  - "CapacitorKeyboard (from `../../node_modules/@capacitor/keyboard`)"
110
-  - "CapacitorPreferences (from `../../node_modules/@capacitor/preferences`)"
111
-  - "CapacitorPushNotifications (from `../../node_modules/@capacitor/push-notifications`)"
112
-  - "CapacitorShare (from `../../node_modules/@capacitor/share`)"
113
-  - "CapacitorStatusBar (from `../../node_modules/@capacitor/status-bar`)"
114
-  - "CapgoInappbrowser (from `../../node_modules/@capgo/inappbrowser`)"
115
-  - "CodetrixStudioCapacitorGoogleAuth (from `../../node_modules/@codetrix-studio/capacitor-google-auth`)"
116
-  - Firebase/Messaging
117
-
118
-SPEC REPOS:
119
-  trunk:
120
-    - AppAuth
121
-    - FBAEMKit
122
-    - FBSDKCoreKit
123
-    - FBSDKCoreKit_Basics
124
-    - FBSDKLoginKit
125
-    - Firebase
126
-    - FirebaseCore
127
-    - FirebaseCoreInternal
128
-    - FirebaseInstallations
129
-    - FirebaseMessaging
130
-    - GoogleDataTransport
131
-    - GoogleSignIn
132
-    - GoogleUtilities
133
-    - GTMAppAuth
134
-    - GTMSessionFetcher
135
-    - nanopb
136
-    - PromisesObjC
137
-
138
-EXTERNAL SOURCES:
139
-  Capacitor:
140
-    :path: "../../node_modules/@capacitor/ios"
141
-  CapacitorApp:
142
-    :path: "../../node_modules/@capacitor/app"
143
-  CapacitorCommunityFacebookLogin:
144
-    :path: "../../node_modules/@capacitor-community/facebook-login"
145
-  CapacitorCordova:
146
-    :path: "../../node_modules/@capacitor/ios"
147
-  CapacitorHaptics:
148
-    :path: "../../node_modules/@capacitor/haptics"
149
-  CapacitorKeyboard:
150
-    :path: "../../node_modules/@capacitor/keyboard"
151
-  CapacitorPreferences:
152
-    :path: "../../node_modules/@capacitor/preferences"
153
-  CapacitorPushNotifications:
154
-    :path: "../../node_modules/@capacitor/push-notifications"
155
-  CapacitorShare:
156
-    :path: "../../node_modules/@capacitor/share"
157
-  CapacitorStatusBar:
158
-    :path: "../../node_modules/@capacitor/status-bar"
159
-  CapgoInappbrowser:
160
-    :path: "../../node_modules/@capgo/inappbrowser"
161
-  CodetrixStudioCapacitorGoogleAuth:
162
-    :path: "../../node_modules/@codetrix-studio/capacitor-google-auth"
163
-
164
-SPEC CHECKSUMS:
165
-  AppAuth: 3bb1d1cd9340bd09f5ed189fb00b1cc28e1e8570
166
-  Capacitor: 57890b363df14d5d2d5d8461aa23e886cb34da2a
167
-  CapacitorApp: 024e1b1bea5f883d79f6330d309bc441c88ad04a
168
-  CapacitorCommunityFacebookLogin: c0e2bb54cb567d90443a80ae20569fdac0df3f89
169
-  CapacitorCordova: 3d3908a3d208a11a75f9df3b18c4405c4de76e1d
170
-  CapacitorHaptics: 1fffc1217c7e64a472d7845be50fb0c2f7d4204c
171
-  CapacitorKeyboard: b978154b024a5f65e044908e37d15b7de58b9d12
172
-  CapacitorPreferences: f03954bcb0ff09c792909e46bff88e3183c16b10
173
-  CapacitorPushNotifications: b31e326c6e4eb216a622041d6ca21a973f34943f
174
-  CapacitorShare: cd41743331cb71d217c029de54b681cbd91e0fcc
175
-  CapacitorStatusBar: 565c0a1ebd79bb40d797606a8992b4a105885309
176
-  CapgoInappbrowser: a1d7b17df89659ece82ad102a0775786c6166512
177
-  CodetrixStudioCapacitorGoogleAuth: fcce058390347c1ce5d8ac4764bdf1f5c1ee233b
178
-  FBAEMKit: af2972f39bb0f3f7c45998f435b007833c32ffb2
179
-  FBSDKCoreKit: 19e2e18b3be578d7a51fed8fdd8c152bef0b9511
180
-  FBSDKCoreKit_Basics: dd9826ce3c9fd9f8cdf8dbbd0ef0a53e6c0c9e7e
181
-  FBSDKLoginKit: c395c63a1a6cf4a8a1e6103fd94b8c46329ee81c
182
-  Firebase: f4ac0b02927af9253ae094d23deecf0890da7374
183
-  FirebaseCore: 534544dd98cabcf4bf8598d88ec683b02319a528
184
-  FirebaseCoreInternal: 2cf9202e226e3f78d2bf6d56c472686b935bfb7f
185
-  FirebaseInstallations: 9387bf15abfc69a714f54e54f74a251264fdb79b
186
-  FirebaseMessaging: 1367b28c0c83a63072af4a711328fcc2e6899902
187
-  GoogleDataTransport: 54dee9d48d14580407f8f5fbf2f496e92437a2f2
188
-  GoogleSignIn: 5651ce3a61e56ca864160e79b484cd9ed3f49b7a
189
-  GoogleUtilities: 202e7a9f5128accd11160fb9c19612de1911aa19
190
-  GTMAppAuth: 0ff230db599948a9ad7470ca667337803b3fc4dd
191
-  GTMSessionFetcher: 3a63d75eecd6aa32c2fc79f578064e1214dfdec2
192
-  nanopb: d4d75c12cd1316f4a64e3c6963f879ecd4b5e0d5
193
-  PromisesObjC: c50d2056b5253dadbd6c2bea79b0674bd5a52fa4
194
-
195
-PODFILE CHECKSUM: e092ee1cde7b2ee2c683b5d37e9df1aa750682e4
196
-
197
-COCOAPODS: 1.12.1

Разница между файлами не показана из-за своего большого размера
+ 3089 - 115
package-lock.json


+ 3 - 0
package.json

@@ -12,6 +12,7 @@
12 12
     "lint": "eslint"
13 13
   },
14 14
   "dependencies": {
15
+    "@capacitor-community/apple-sign-in": "^5.0.0",
15 16
     "@capacitor-community/facebook-login": "^5.0.3",
16 17
     "@capacitor/app": "5.0.6",
17 18
     "@capacitor/core": "5.5.0",
@@ -21,6 +22,7 @@
21 22
     "@capacitor/preferences": "^5.0.6",
22 23
     "@capacitor/push-notifications": "^5.1.0",
23 24
     "@capacitor/share": "^5.0.6",
25
+    "@capacitor/splash-screen": "^5.0.6",
24 26
     "@capacitor/status-bar": "5.0.6",
25 27
     "@capgo/inappbrowser": "^1.2.19",
26 28
     "@codetrix-studio/capacitor-google-auth": "^3.3.4",
@@ -44,6 +46,7 @@
44 46
     "vue-vimeo-player": "^1.1.2"
45 47
   },
46 48
   "devDependencies": {
49
+    "@capacitor/assets": "^3.0.4",
47 50
     "@capacitor/cli": "5.5.0",
48 51
     "@vitejs/plugin-legacy": "^4.0.2",
49 52
     "@vitejs/plugin-vue": "^4.0.0",

BIN
public/images/circlelogo-trans.png


BIN
public/images/logo.png


+ 46 - 0
public/manifest.webmanifest

@@ -0,0 +1,46 @@
1
+{
2
+  "icons": [
3
+    {
4
+      "src": "../icons/icon-48.webp",
5
+      "type": "image/png",
6
+      "sizes": "48x48",
7
+      "purpose": "any maskable"
8
+    },
9
+    {
10
+      "src": "../icons/icon-72.webp",
11
+      "type": "image/png",
12
+      "sizes": "72x72",
13
+      "purpose": "any maskable"
14
+    },
15
+    {
16
+      "src": "../icons/icon-96.webp",
17
+      "type": "image/png",
18
+      "sizes": "96x96",
19
+      "purpose": "any maskable"
20
+    },
21
+    {
22
+      "src": "../icons/icon-128.webp",
23
+      "type": "image/png",
24
+      "sizes": "128x128",
25
+      "purpose": "any maskable"
26
+    },
27
+    {
28
+      "src": "../icons/icon-192.webp",
29
+      "type": "image/png",
30
+      "sizes": "192x192",
31
+      "purpose": "any maskable"
32
+    },
33
+    {
34
+      "src": "../icons/icon-256.webp",
35
+      "type": "image/png",
36
+      "sizes": "256x256",
37
+      "purpose": "any maskable"
38
+    },
39
+    {
40
+      "src": "../icons/icon-512.webp",
41
+      "type": "image/png",
42
+      "sizes": "512x512",
43
+      "purpose": "any maskable"
44
+    }
45
+  ]
46
+}

+ 13 - 2
src/App.vue

@@ -5,13 +5,24 @@
5 5
 </template>
6 6
 
7 7
 <script setup lang="ts">
8
-import { IonApp, IonRouterOutlet, onIonViewWillEnter } from '@ionic/vue';
8
+import { IonApp, IonRouterOutlet, onIonViewWillEnter, onIonViewDidEnter } from '@ionic/vue';
9 9
 import { defineComponent, onMounted } from 'vue';
10
+import { SplashScreen } from '@capacitor/splash-screen';
10 11
 
11 12
 
12 13
 
14
+onMounted(async () => {
15
+  //alert("Hello");
16
+  /*
17
+  await SplashScreen.show({
18
+    showDuration: 2000,
19
+    autoHide: true,
20
+  });*/
21
+});
22
+
13 23
 onIonViewWillEnter(() => {
14 24
   console.log("Init On Mouting")
15 25
 });
16
-
26
+onIonViewDidEnter(() => {
27
+});
17 28
 </script>

+ 1 - 1
src/components/SearchItem.vue

@@ -3,7 +3,7 @@
3 3
     <ion-thumbnail slot="start">
4 4
       <ion-img alt="Silhouette of mountains" :src="thmb"  v-if="thmb" />
5 5
     </ion-thumbnail>
6
-    <ion-label>{{ name }} <br><span class='small'><ion-icon :icon="timer" size="small" />{{ dt }}</span></ion-label>
6
+    <ion-label color="light">{{ name }} <br><span class='small'><ion-icon :icon="timer" size="small" />{{ dt }}</span></ion-label>
7 7
   </ion-item>
8 8
 </template>
9 9
 

+ 36 - 5
src/composable/settings.ts

@@ -12,6 +12,7 @@ export const TOKEN = '173cb9e357a861abd91e8008fab9246e0cc116af'
12 12
 export const BASE_URL = 'http://localhost:8020/'
13 13
 //export const BASE_URL = 'https://www.tigermuaythai.live/'
14 14
 
15
+export const APPLE_CALLBACK = BASE_URL + "soc_accounts/apple/login/callback/";
15 16
 //const axios = setupCache(Axios); 
16 17
 //
17 18
 //axios.defaults.xsrfHeaderName = "X-CSRFTOKEN";
@@ -43,7 +44,7 @@ export const getToken = async () => {
43 44
   console.log("get token ")
44 45
   const token = await Preferences.get({ key: 'token' });
45 46
   console.log(token)
46
-  if( token.value == null ) {
47
+  if( token.value == null || token.value == "" ) {
47 48
     //const { data } = await axios.post(BASE_URL + "api-token-auth/", {username: 'root', password: 'Tum 1984'})
48 49
     const { data } = await axios.post(BASE_URL + "dj-rest-auth/login/", {username: 'root', password: 'Tum 1984'})
49 50
     console.log("get token ", data)
@@ -265,9 +266,10 @@ export const facebookLogin = async(access_token) => {
265 266
     headers: {
266 267
       'Content-Type': 'application/json', 
267 268
     }
268
-  }).catch((error) => {
269
-    console.log("fb error = ", error)
270 269
   })
270
+  //.catch((error) => {
271
+    //console.log("fb error = ", error)
272
+  //})
271 273
   console.log("facebook login = ", data)
272 274
   return data
273 275
 }
@@ -280,9 +282,10 @@ export const ggLogin = async(access_token, id_token) => {
280 282
     headers: {
281 283
       'Content-Type': 'application/json', 
282 284
     }
283
-  }).catch((error) => {
284
-    console.log("gg error = ", error)
285 285
   })
286
+  //.catch((error) => {
287
+    //console.log("gg error = ", error)
288
+  //})
286 289
   console.log("gg login = ", data)
287 290
   return data
288 291
 }
@@ -389,3 +392,31 @@ export const likeMat = async (cid) => {
389 392
   console.info(data)
390 393
   return data
391 394
 }
395
+
396
+
397
+export const updateNoti = async (noti) => {
398
+  const token = await Preferences.get({ key: 'token' });
399
+  console.log("token = ", token)
400
+  const { data } = await axios.post(BASE_URL + `backend/api/profiles/update_noti/`,
401
+  {live_noti: noti.liveNoti, 'news_noti':noti.newsNoti},
402
+  {
403
+    headers: { 
404
+    'Authorization': `Token ${token.value}`
405
+    }
406
+  })
407
+  console.info(data)
408
+  return data
409
+}
410
+
411
+export const appleLogin = async(access_token) => {
412
+
413
+  const token = await Preferences.get({ key: 'token' });
414
+  console.log("access_code = ", access_token)
415
+  const { data } = await axios.post(BASE_URL + 'dj-rest-auth/apple/',{access_token: access_token.authorizationCode, id_token: access_token.identityToken}, {
416
+    headers: {
417
+      'Content-Type': 'application/json', 
418
+    }
419
+  })
420
+  console.log("apple login = ", data)
421
+  return data
422
+}

+ 1 - 0
src/views/CourseMatDetailPage.vue

@@ -10,6 +10,7 @@
10 10
       </ion-toolbar>
11 11
     </ion-header>
12 12
     <ion-content class='ion-text-wrap'>
13
+      
13 14
       <div style="padding:56.25% 0 0 0;position:relative;" v-html="mat.embed" v-if='mat'></div>
14 15
       <div v-if="mat" class='ion-padding ion-text-wrap'>
15 16
         <h2 v-if='name'>{{ name }}</h2>

+ 98 - 15
src/views/ProfilePage.vue

@@ -16,10 +16,10 @@
16 16
             <ion-label>Notifications</ion-label>
17 17
           </ion-list-header>
18 18
           <ion-item>
19
-            <ion-toggle v-model="liveNoti" color="primary">Receive Live Notifications</ion-toggle>
19
+            <ion-toggle v-model="noti.liveNoti" color="primary" @ionChange="onNoti">Receive Live Notifications</ion-toggle>
20 20
           </ion-item>
21 21
           <ion-item>
22
-            <ion-toggle v-model="newsNoti">Receive News Update</ion-toggle>
22
+            <ion-toggle v-model="noti.newsNoti" @ionChange="onNoti">Receive News Update</ion-toggle>
23 23
           </ion-item>
24 24
           <ion-list-header>
25 25
             <ion-label>Select Courses You like</ion-label>
@@ -41,6 +41,7 @@
41 41
       <ion-button @click='fbLogout' expand='full'>Logout</ion-button>
42 42
       </template>
43 43
       <template v-else>
44
+        <ion-img src="/images/circlelogo-trans.png" style='width:200px; margin:10px auto' />
44 45
         <LoginForm @user-login="userLogin" />
45 46
         <ion-grid>
46 47
             <ion-row>
@@ -52,17 +53,29 @@
52 53
               </ion-col>
53 54
             </ion-row>
54 55
         </ion-grid>
56
+        <div color="light" v-if="formError" class='ion-margin ion-text-center'>{{ formError }}</div>
55 57
         <ion-grid>
58
+          <h3 class='ion-text-center'>Login With</h3>
56 59
           <ion-row class='ion-justify-content-center'>
57
-            <ion-col size=6>
58
-              <ion-button @click='fbLogin' expand='full'>Facebook Login</ion-button>
60
+            <ion-col size=4>
61
+              <ion-button @click='fbLogin' expand='full'>
62
+                <ion-icon slot="start" :icon="logoFacebook"></ion-icon>
63
+
64
+                Facebook</ion-button>
65
+            </ion-col>
66
+            <ion-col size=4>
67
+              <ion-button @click='ggLoginClick' expand='full'>
68
+
69
+                <ion-icon slot="start" :icon="logoGoogle"></ion-icon>
70
+                Google</ion-button>
59 71
             </ion-col>
60
-            <ion-col size=6>
61
-              <ion-button @click='ggLoginClick' expand='full'>Google Login</ion-button>
72
+            <ion-col size=4>
73
+              <ion-button @click='onAppleLogin' expand='full'>
74
+                <ion-icon slot="start" :icon="logoApple"></ion-icon>
75
+                Apple</ion-button>
62 76
             </ion-col>
63 77
           </ion-row>
64 78
         </ion-grid>
65
-        <ion-text color="danger" v-if="formError">{{ formError }}</ion-text>
66 79
       </template>
67 80
     </ion-content>
68 81
   </ion-page>
@@ -74,11 +87,24 @@ import ExploreContainer from '@/components/ExploreContainer.vue';
74 87
 import LoginForm from '@/components/LoginForm.vue';
75 88
 import { defineComponent, onMounted } from 'vue';
76 89
 import { GoogleAuth } from '@codetrix-studio/capacitor-google-auth';
77
-import { facebookLogin, setUserToken, logout, clearPref, BASE_URL, listCourses, getPref, likeCourse, isLogin, ggLogin } from '@/composable/settings';
90
+import { facebookLogin, setUserToken, logout, clearPref, BASE_URL, listCourses, getPref, likeCourse, isLogin, ggLogin, updateNoti, APPLE_CALLBACK, appleLogin } from '@/composable/settings';
78 91
 import { InAppBrowser } from '@capgo/inappbrowser'
79
-import { close, closeCircle, pin } from 'ionicons/icons';
92
+import { close, closeCircle, pin, logoApple, logoFacebook, logoGoogle  } from 'ionicons/icons';
80 93
 
81 94
 
95
+import {
96
+  SignInWithApple,
97
+  SignInWithAppleResponse,
98
+  SignInWithAppleOptions,
99
+} from '@capacitor-community/apple-sign-in';
100
+
101
+let apple_options: SignInWithAppleOptions = {
102
+  clientId: 'net.simplico.tmtlive',
103
+  redirectURI: APPLE_CALLBACK,
104
+  scopes: 'email name',
105
+  state: 'TMTLIVE',
106
+  nonce: 'nonce',
107
+};
82 108
 
83 109
 
84 110
 onMounted(() => {
@@ -90,7 +116,7 @@ import {
90 116
   FacebookLoginResponse,
91 117
 } from '@capacitor-community/facebook-login';
92 118
 
93
-import { ref } from 'vue';
119
+import { ref, reactive } from 'vue';
94 120
 
95 121
 const FACEBOOK_PERMISSIONS = [
96 122
   'email',
@@ -107,7 +133,7 @@ const list_courses = ref([])
107 133
 const formError = ref(null)
108 134
 const selecteds = ref([])
109 135
 const myprofile = ref()
110
-
136
+const noti = reactive({liveNoti: true, newsNoti: true});
111 137
 const openReset = async () => {
112 138
   console.log("open Reset")
113 139
   const browser = await InAppBrowser.open({ url: BASE_URL + "accounts/password_reset/" });
@@ -150,7 +176,8 @@ const ggLoginClick = async () => {
150 176
       refIsLogin.value = true
151 177
       
152 178
     }catch(error) {
153
-      formError.value = "Please Check Your UserId/Password"
179
+      console.log(error);
180
+      formError.value = error.response.data.non_field_errors.join("\n");
154 181
       console.log(error)
155 182
     }
156 183
   }
@@ -172,7 +199,7 @@ const fbLogin = async () => {
172 199
       // Login successful.
173 200
       refIsLogin.value = true
174 201
     }catch(error) {
175
-      formError.value = "Please Check Your UserId/Password"
202
+      formError.value = error.response.data.non_field_errors.join("\n");
176 203
     }
177 204
     console.log(`Facebook access token is ${result.accessToken.token}`);
178 205
   }
@@ -190,6 +217,7 @@ const btnLogout = async () => {
190 217
 onIonViewWillEnter(async () => {
191 218
   console.log("ion view will enter")
192 219
   console.log(await isLogin())
220
+  /*
193 221
   const result = await (<FacebookLoginResponse>(
194 222
     FacebookLogin.getCurrentAccessToken()
195 223
   ));
@@ -200,10 +228,13 @@ onIonViewWillEnter(async () => {
200 228
     await getProfile()
201 229
   }else {
202 230
     refIsLogin.value = false
203
-  }
231
+  }*/
204 232
 
205 233
   list_courses.value = await listCourses()
206
-  ggCheckLogin()
234
+  //ggCheckLogin()
235
+
236
+  //appleCheckLogin()
237
+
207 238
   refIsLogin.value = await isLogin()
208 239
   if( refIsLogin.value == true ) {
209 240
     myprofile.value  = await getPref()
@@ -231,6 +262,30 @@ const ggCheckLogin = async() => {
231 262
             }
232 263
         });
233 264
 }
265
+const appleCheckLogin = async() => {
266
+
267
+  SignInWithApple.authorize(apple_options)
268
+  .then(async (result: SignInWithAppleResponse) => {
269
+    console.debug(result);
270
+    // Handle user information
271
+    try{
272
+      //let d = await appleLogin(result.response)
273
+      //console.log("apple authen ", d)
274
+      //await setUserToken(d.key)
275
+      myprofile.value  = await getPref()
276
+      //await getProfile()
277
+      // Login successful.
278
+      refIsLogin.value = true
279
+    }catch(error) {
280
+      console.log("apple check login ", error);
281
+      //formError.value = error.response.data.non_field_errors[0]
282
+    }
283
+    // Validate token with server and create new session
284
+  })
285
+  .catch(error => {
286
+    // Handle error
287
+  });
288
+}
234 289
 const clear = async() => {
235 290
   await clearPref()
236 291
 }
@@ -260,4 +315,32 @@ const handleChange = async (ev) =>{
260 315
   }
261 316
 
262 317
 }
318
+const onNoti = async(ev) => {
319
+  console.log(noti);
320
+  const data = await updateNoti(noti);
321
+  console.log(data);
322
+}
323
+const onAppleLogin = async () => { 
324
+  SignInWithApple.authorize(apple_options)
325
+  .then(async (result: SignInWithAppleResponse) => {
326
+    console.debug(result);
327
+    // Handle user information
328
+    try{
329
+      let d = await appleLogin(result.response)
330
+      console.log("apple authen ", d)
331
+      await setUserToken(d.key)
332
+      myprofile.value  = await getPref()
333
+      //await getProfile()
334
+      // Login successful.
335
+      refIsLogin.value = true
336
+    }catch(error) {
337
+      console.log(error);
338
+      formError.value = error.response.data.non_field_errors.join("\n");
339
+    }
340
+    // Validate token with server and create new session
341
+  })
342
+  .catch(error => {
343
+    // Handle error
344
+  });
345
+}
263 346
 </script>

+ 19 - 6
src/views/Tab1Page.vue

@@ -61,7 +61,7 @@
61 61
 <script setup lang="ts">
62 62
 
63 63
   import { IonPage, IonHeader, IonToolbar, IonTitle, IonContent, IonIcon, onIonViewWillEnter, IonButton, 
64
-  onIonViewWillLeave, IonItem, IonLabel, IonThumbnail, IonCol, IonGrid, IonRow, IonCard, IonCardContent, IonCardHeader, IonCardSubtitle, IonCardTitle, onIonViewDidEnter,  IonButtons, IonImg } from '@ionic/vue';
64
+  onIonViewWillLeave, IonItem, IonLabel, IonThumbnail, IonCol, IonGrid, IonRow, IonCard, IonCardContent, IonCardHeader, IonCardSubtitle, IonCardTitle, onIonViewDidEnter,  IonButtons, IonImg, useIonRouter } from '@ionic/vue';
65 65
 
66 66
 import ExploreContainer  from '@/components/ExploreContainer.vue';
67 67
 import CourseSchedule from '@/components/CourseSchedule.vue'
@@ -72,7 +72,7 @@ import SearchEngine from '@/components/SearchEngine.vue'
72 72
 import { CapacitorHttp } from '@capacitor/core';
73 73
 import { ref } from 'vue';
74 74
 import { TOKEN, getProducts, setToken, getObject, getToken, getTrainers, listMats, storeAPNToken,
75
-getTodayProgs, getLive, getPosts, initAPI} from '@/composable/settings';
75
+getTodayProgs, getLive, getPosts, initAPI, clearPref, isLogin} from '@/composable/settings';
76 76
 //import VueCoreVideoPlayer from 'vue-core-video-player'
77 77
 import { vueVimeoPlayer } from 'vue-vimeo-player'
78 78
 
@@ -105,6 +105,8 @@ const scrollToBottom = () => {
105 105
 };
106 106
 const items = ref([{msg: 'foo'}, {msg: 'bar2'}])
107 107
 
108
+const ionRouter = useIonRouter();
109
+
108 110
 const options = {
109 111
       id: 59777392,
110 112
       width: 640,
@@ -117,6 +119,11 @@ const options = {
117 119
 const liveObj = ref()
118 120
 const modules =  [Autoplay, Keyboard, Pagination, Scrollbar, Zoom]
119 121
   onIonViewWillEnter(async () => {
122
+    let v = await isLogin()
123
+    console.log("v === ", v)
124
+    if( v == false ) {
125
+      ionRouter.navigate('/tabs/tab4', 'forward', 'replace');
126
+    }
120 127
     //console.log("video " ,video)
121 128
     //console.log("video id", video.value.id)
122 129
     //const player = new Player(video.value.id, options);
@@ -134,9 +141,15 @@ const modules =  [Autoplay, Keyboard, Pagination, Scrollbar, Zoom]
134 141
     //console.log('u ', u)
135 142
     await initAPI()
136 143
     token.value = await getToken()
137
-    getTrainers().then( (data) => {
138
-      trainers.value = data
139
-    })
144
+    
145
+    try{
146
+      trainers.value = await getTrainers()
147
+    }catch(error){
148
+      console.log("trainers ", error)
149
+      await clearPref()
150
+      token.value = await getToken()
151
+    }
152
+
140 153
     listMats().then( (data) => {
141 154
       mats.value = data
142 155
     })
@@ -157,7 +170,7 @@ const modules =  [Autoplay, Keyboard, Pagination, Scrollbar, Zoom]
157 170
       if( liveObj.value == null ||  liveObj.value.result == false ) {
158 171
         liveObj.value = await getLive()
159 172
       }
160
-    }, 10000)
173
+    }, 100000)
161 174
   })
162 175
 
163 176
   onIonViewWillLeave(() => {

+ 10 - 2
src/views/Tab2Page.vue

@@ -31,16 +31,24 @@
31 31
 </template>
32 32
 
33 33
 <script setup lang="ts">
34
-import { IonPage, IonHeader, IonToolbar, IonTitle, IonContent, IonGrid, IonRow, IonCol, onIonViewWillEnter, IonProgressBar, IonIcon, IonButtons, IonButton} from '@ionic/vue';
34
+import { IonPage, IonHeader, IonToolbar, IonTitle, IonContent, IonGrid, IonRow, IonCol, onIonViewWillEnter, IonProgressBar, IonIcon, IonButtons, IonButton, useIonRouter} from '@ionic/vue';
35 35
 import { search } from 'ionicons/icons';
36 36
 
37 37
 import Course from '@/components/Course.vue';
38 38
 import { ref } from 'vue';
39 39
 
40
-import {listCourses} from '@/composable/settings';
40
+import {listCourses, isLogin} from '@/composable/settings';
41 41
 const courses = ref([]);
42 42
 const processing = ref(false);
43
+const ionRouter = useIonRouter();
44
+
43 45
 onIonViewWillEnter(async () => {
46
+  let v = await isLogin()
47
+  console.log("v === ", v)
48
+  if( v == false ) {
49
+    ionRouter.navigate('/tabs/tab4', 'forward', 'replace');
50
+  }
51
+
44 52
   processing.value = true;
45 53
   courses.value = await listCourses()
46 54
   processing.value = false;

+ 8 - 2
src/views/Tab3Page.vue

@@ -81,13 +81,13 @@
81 81
 
82 82
 <script setup lang="ts">
83 83
 import { IonPage, IonHeader, IonToolbar, IonTitle, IonContent, IonIcon, IonSegment, IonSegmentButton, onIonViewWillEnter, IonGrid, 
84
-IonRow, IonCol, IonButton, IonButtons } from '@ionic/vue';
84
+IonRow, IonCol, IonButton, IonButtons, useIonRouter } from '@ionic/vue';
85 85
 import { home, heart, pin, star, call, globe, basket, barbell, trash, person, search } from 'ionicons/icons';
86 86
 import ExploreContainer from '@/components/ExploreContainer.vue';
87 87
 import CourseSchedule from '@/components/CourseSchedule.vue';
88 88
 import { ref } from 'vue';
89 89
 
90
-import { getTodayProgs } from '@/composable/settings';
90
+import { getTodayProgs, isLogin } from '@/composable/settings';
91 91
 
92 92
 const today = ref()
93 93
 const weekday = ["sun","mon","tue","wed","thu","fri","sat"];
@@ -98,10 +98,16 @@ const thu = ref()
98 98
 const fri = ref()
99 99
 const sat = ref()
100 100
 const sun = ref()
101
+const ionRouter = useIonRouter();
101 102
 
102 103
 onIonViewWillEnter( async () => {
103 104
   const d = new Date();
104 105
   console.log(" d ", d.getDay())
106
+  let v = await isLogin()
107
+  console.log("v === ", v)
108
+  if( v == false ) {
109
+    ionRouter.navigate('/tabs/tab4', 'forward', 'replace');
110
+  }
105 111
   today.value = weekday[d.getDay()];
106 112
   mon.value = await getTodayProgs("mon")
107 113
   tue.value = await getTodayProgs("tue")

+ 7 - 1
src/views/TabsPage.vue

@@ -27,7 +27,13 @@
27 27
 </template>
28 28
 
29 29
 <script setup lang="ts">
30
-import { IonTabBar, IonTabButton, IonTabs, IonLabel, IonIcon, IonPage, IonRouterOutlet } from '@ionic/vue';
30
+import { IonTabBar, IonTabButton, IonTabs, IonLabel, IonIcon, IonPage, IonRouterOutlet, onIonViewWillEnter, useIonRouter } from '@ionic/vue';
31 31
 import { ellipse, square, triangle, person, time, videocam, grid } from 'ionicons/icons';
32
+import { isLogin } from '@/composable/settings';
32 33
 
34
+const ionRouter = useIonRouter();
35
+
36
+onIonViewWillEnter(async () => {
37
+  console.log("tabs init ...")
38
+})
33 39
 </script>

tum/tmt_learning - Gogs: Simplico Git Service

Keine Beschreibung

Prach Pongpanich 6f337d0a21 install tailwind alpine daisyui vor 2 Jahren
..
node_modules 6f337d0a21 install tailwind alpine daisyui vor 2 Jahren
out 6f337d0a21 install tailwind alpine daisyui vor 2 Jahren
LICENSE 6f337d0a21 install tailwind alpine daisyui vor 2 Jahren
README.md 6f337d0a21 install tailwind alpine daisyui vor 2 Jahren
package.json 6f337d0a21 install tailwind alpine daisyui vor 2 Jahren

README.md

fast-glob

It's a very fast and efficient glob library for Node.js.

This package provides methods for traversing the file system and returning pathnames that matched a defined set of a specified pattern according to the rules used by the Unix Bash shell with some simplifications, meanwhile results are returned in arbitrary order. Quick, simple, effective.

Table of Contents

Details

Highlights

  • Fast. Probably the fastest.
  • Supports multiple and negative patterns.
  • Synchronous, Promise and Stream API.
  • Object mode. Can return more than just strings.
  • Error-tolerant.

Donation

Do you like this project? Support it by donating, creating an issue or pull request.

Donate

Old and modern mode

This package works in two modes, depending on the environment in which it is used.

  • Old mode. Node.js below 10.10 or when the stats option is enabled.
  • Modern mode. Node.js 10.10+ and the stats option is disabled.

The modern mode is faster. Learn more about the internal mechanism.

Pattern syntax

:warning: Always use forward-slashes in glob expressions (patterns and ignore option). Use backslashes for escaping characters.

There is more than one form of syntax: basic and advanced. Below is a brief overview of the supported features. Also pay attention to our FAQ.

:book: This package uses a micromatch as a library for pattern matching.

Basic syntax

  • An asterisk (*) — matches everything except slashes (path separators), hidden files (names starting with .).
  • A double star or globstar (**) — matches zero or more directories.
  • Question mark (?) – matches any single character except slashes (path separators).
  • Sequence ([seq]) — matches any character in sequence.

:book: A few additional words about the basic matching behavior.

Some examples:

  • src/**/*.js — matches all files in the src directory (any level of nesting) that have the .js extension.
  • src/*.?? — matches all files in the src directory (only first level of nesting) that have a two-character extension.
  • file-[01].js — matches files: file-0.js, file-1.js.

Advanced syntax

:book: A few additional words about the advanced matching behavior.

Some examples:

  • src/**/*.{css,scss} — matches all files in the src directory (any level of nesting) that have the .css or .scss extension.
  • file-[[:digit:]].js — matches files: file-0.js, file-1.js, …, file-9.js.
  • file-{1..3}.js — matches files: file-1.js, file-2.js, file-3.js.
  • file-(1|2) — matches files: file-1.js, file-2.js.

Installation

npm install fast-glob

API

Asynchronous

fg(patterns, [options])

Returns a Promise with an array of matching entries.

const fg = require('fast-glob');

const entries = await fg(['.editorconfig', '**/index.js'], { dot: true });

// ['.editorconfig', 'services/index.js']

Synchronous

fg.sync(patterns, [options])

Returns an array of matching entries.

const fg = require('fast-glob');

const entries = fg.sync(['.editorconfig', '**/index.js'], { dot: true });

// ['.editorconfig', 'services/index.js']

Stream

fg.stream(patterns, [options])

Returns a ReadableStream when the data event will be emitted with matching entry.

const fg = require('fast-glob');

const stream = fg.stream(['.editorconfig', '**/index.js'], { dot: true });

for await (const entry of stream) {
	// .editorconfig
	// services/index.js
}

patterns

  • Required: true
  • Type: string | string[]

Any correct pattern(s).

:1234: Pattern syntax

:warning: This package does not respect the order of patterns. First, all the negative patterns are applied, and only then the positive patterns. If you want to get a certain order of records, use sorting or split calls.

[options]

See Options section.

Helpers

generateTasks(patterns, [options])

Returns the internal representation of patterns (Task is a combining patterns by base directory).

fg.generateTasks('*');

[{
    base: '.', // Parent directory for all patterns inside this task
    dynamic: true, // Dynamic or static patterns are in this task
    patterns: ['*'],
    positive: ['*'],
    negative: []
}]
patterns
  • Required: true
  • Type: string | string[]

Any correct pattern(s).

[options]

See Options section.

isDynamicPattern(pattern, [options])

Returns true if the passed pattern is a dynamic pattern.

:1234: What is a static or dynamic pattern?

fg.isDynamicPattern('*'); // true
fg.isDynamicPattern('abc'); // false
pattern
  • Required: true
  • Type: string

Any correct pattern.

[options]

See Options section.

escapePath(pattern)

Returns a path with escaped special characters (*?|(){}[], ! at the beginning of line, @+! before the opening parenthesis).

fg.escapePath('!abc'); // \\!abc
fg.escapePath('C:/Program Files (x86)'); // C:/Program Files \\(x86\\)
pattern
  • Required: true
  • Type: string

Any string, for example, a path to a file.

Options

Common options

concurrency

  • Type: number
  • Default: os.cpus().length

Specifies the maximum number of concurrent requests from a reader to read directories.

:book: The higher the number, the higher the performance and load on the file system. If you want to read in quiet mode, set the value to a comfortable number or 1.

cwd

  • Type: string
  • Default: process.cwd()

The current working directory in which to search.

deep

  • Type: number
  • Default: Infinity

Specifies the maximum depth of a read directory relative to the start directory.

For example, you have the following tree:

dir/
└── one/            // 1
    └── two/        // 2
        └── file.js // 3
// With base directory
fg.sync('dir/**', { onlyFiles: false, deep: 1 }); // ['dir/one']
fg.sync('dir/**', { onlyFiles: false, deep: 2 }); // ['dir/one', 'dir/one/two']

// With cwd option
fg.sync('**', { onlyFiles: false, cwd: 'dir', deep: 1 }); // ['one']
fg.sync('**', { onlyFiles: false, cwd: 'dir', deep: 2 }); // ['one', 'one/two']

:book: If you specify a pattern with some base directory, this directory will not participate in the calculation of the depth of the found directories. Think of it as a cwd option.

followSymbolicLinks

  • Type: boolean
  • Default: true

Indicates whether to traverse descendants of symbolic link directories when expanding ** patterns.

:book: Note that this option does not affect the base directory of the pattern. For example, if ./a is a symlink to directory ./b and you specified ['./a**', './b/**'] patterns, then directory ./a will still be read.

:book: If the stats option is specified, the information about the symbolic link (fs.lstat) will be replaced with information about the entry (fs.stat) behind it.

fs

  • Type: FileSystemAdapter
  • Default: fs.*

Custom implementation of methods for working with the file system.

export interface FileSystemAdapter {
    lstat?: typeof fs.lstat;
    stat?: typeof fs.stat;
    lstatSync?: typeof fs.lstatSync;
    statSync?: typeof fs.statSync;
    readdir?: typeof fs.readdir;
    readdirSync?: typeof fs.readdirSync;
}

ignore

  • Type: string[]
  • Default: []

An array of glob patterns to exclude matches. This is an alternative way to use negative patterns.

dir/
├── package-lock.json
└── package.json
fg.sync(['*.json', '!package-lock.json']);            // ['package.json']
fg.sync('*.json', { ignore: ['package-lock.json'] }); // ['package.json']

suppressErrors

  • Type: boolean
  • Default: false

By default this package suppress only ENOENT errors. Set to true to suppress any error.

:book: Can be useful when the directory has entries with a special level of access.

throwErrorOnBrokenSymbolicLink

  • Type: boolean
  • Default: false

Throw an error when symbolic link is broken if true or safely return lstat call if false.

:book: This option has no effect on errors when reading the symbolic link directory.

Output control

absolute

  • Type: boolean
  • Default: false

Return the absolute path for entries.

fg.sync('*.js', { absolute: false }); // ['index.js']
fg.sync('*.js', { absolute: true });  // ['/home/user/index.js']

:book: This option is required if you want to use negative patterns with absolute path, for example, !${__dirname}/*.js.

markDirectories

  • Type: boolean
  • Default: false

Mark the directory path with the final slash.

fg.sync('*', { onlyFiles: false, markDirectories: false }); // ['index.js', 'controllers']
fg.sync('*', { onlyFiles: false, markDirectories: true });  // ['index.js', 'controllers/']

objectMode

  • Type: boolean
  • Default: false

Returns objects (instead of strings) describing entries.

fg.sync('*', { objectMode: false }); // ['src/index.js']
fg.sync('*', { objectMode: true });  // [{ name: 'index.js', path: 'src/index.js', dirent: <fs.Dirent> }]

The object has the following fields:

  • name (string) — the last part of the path (basename)
  • path (string) — full path relative to the pattern base directory
  • dirent (fs.Dirent) — instance of fs.Dirent

:book: An object is an internal representation of entry, so getting it does not affect performance.

onlyDirectories

  • Type: boolean
  • Default: false

Return only directories.

fg.sync('*', { onlyDirectories: false }); // ['index.js', 'src']
fg.sync('*', { onlyDirectories: true });  // ['src']

:book: If true, the onlyFiles option is automatically false.

onlyFiles

  • Type: boolean
  • Default: true

Return only files.

fg.sync('*', { onlyFiles: false }); // ['index.js', 'src']
fg.sync('*', { onlyFiles: true });  // ['index.js']

stats

  • Type: boolean
  • Default: false

Enables an object mode with an additional field:

  • stats (fs.Stats) — instance of fs.Stats
fg.sync('*', { stats: false }); // ['src/index.js']
fg.sync('*', { stats: true });  // [{ name: 'index.js', path: 'src/index.js', dirent: <fs.Dirent>, stats: <fs.Stats> }]

:book: Returns fs.stat instead of fs.lstat for symbolic links when the followSymbolicLinks option is specified.

:warning: Unlike object mode this mode requires additional calls to the file system. On average, this mode is slower at least twice. See old and modern mode for more details.

unique

  • Type: boolean
  • Default: true

Ensures that the returned entries are unique.

fg.sync(['*.json', 'package.json'], { unique: false }); // ['package.json', 'package.json']
fg.sync(['*.json', 'package.json'], { unique: true });  // ['package.json']

If true and similar entries are found, the result is the first found.

Matching control

braceExpansion

  • Type: boolean
  • Default: true

Enables Bash-like brace expansion.

:1234: Syntax description or more detailed description.

dir/
├── abd
├── acd
└── a{b,c}d
fg.sync('a{b,c}d', { braceExpansion: false }); // ['a{b,c}d']
fg.sync('a{b,c}d', { braceExpansion: true });  // ['abd', 'acd']

caseSensitiveMatch

  • Type: boolean
  • Default: true

Enables a case-sensitive mode for matching files.

dir/
├── file.txt
└── File.txt
fg.sync('file.txt', { caseSensitiveMatch: false }); // ['file.txt', 'File.txt']
fg.sync('file.txt', { caseSensitiveMatch: true });  // ['file.txt']

dot

  • Type: boolean
  • Default: false

Allow patterns to match entries that begin with a period (.).

:book: Note that an explicit dot in a portion of the pattern will always match dot files.

dir/
├── .editorconfig
└── package.json
fg.sync('*', { dot: false }); // ['package.json']
fg.sync('*', { dot: true });  // ['.editorconfig', 'package.json']

extglob

  • Type: boolean
  • Default: true

Enables Bash-like extglob functionality.

:1234: Syntax description.

dir/
├── README.md
└── package.json
fg.sync('*.+(json|md)', { extglob: false }); // []
fg.sync('*.+(json|md)', { extglob: true });  // ['README.md', 'package.json']

globstar

  • Type: boolean
  • Default: true

Enables recursively repeats a pattern containing **. If false, ** behaves exactly like *.

dir/
└── a
    └── b
fg.sync('**', { onlyFiles: false, globstar: false }); // ['a']
fg.sync('**', { onlyFiles: false, globstar: true });  // ['a', 'a/b']

baseNameMatch

  • Type: boolean
  • Default: false

If set to true, then patterns without slashes will be matched against the basename of the path if it contains slashes.

dir/
└── one/
    └── file.md
fg.sync('*.md', { baseNameMatch: false }); // []
fg.sync('*.md', { baseNameMatch: true });  // ['one/file.md']

FAQ

What is a static or dynamic pattern?

All patterns can be divided into two types:

  • static. A pattern is considered static if it can be used to get an entry on the file system without using matching mechanisms. For example, the file.js pattern is a static pattern because we can just verify that it exists on the file system.
  • dynamic. A pattern is considered dynamic if it cannot be used directly to find occurrences without using a matching mechanisms. For example, the * pattern is a dynamic pattern because we cannot use this pattern directly.

A pattern is considered dynamic if it contains the following characters ( — any characters or their absence) or options:

  • The caseSensitiveMatch option is disabled
  • \\ (the escape character)
  • *, ?, ! (at the beginning of line)
  • […]
  • (…|…)
  • @(…), !(…), *(…), ?(…), +(…) (respects the extglob option)
  • {…,…}, {…..…} (respects the braceExpansion option)

How to write patterns on Windows?

Always use forward-slashes in glob expressions (patterns and ignore option). Use backslashes for escaping characters. With the cwd option use a convenient format.

Bad

[
	'directory\\*',
	path.join(process.cwd(), '**')
]

Good

[
	'directory/*',
	path.join(process.cwd(), '**').replace(/\\/g, '/')
]

:book: Use the normalize-path or the unixify package to convert Windows-style path to a Unix-style path.

Read more about matching with backslashes.

Why are parentheses match wrong?

dir/
└── (special-*file).txt
fg.sync(['(special-*file).txt']) // []

Refers to Bash. You need to escape special characters:

fg.sync(['\\(special-*file\\).txt']) // ['(special-*file).txt']

Read more about matching special characters as literals.

How to exclude directory from reading?

You can use a negative pattern like this: !**/node_modules or !**/node_modules/**. Also you can use ignore option. Just look at the example below.

first/
├── file.md
└── second/
    └── file.txt

If you don't want to read the second directory, you must write the following pattern: !**/second or !**/second/**.

fg.sync(['**/*.md', '!**/second']);                 // ['first/file.md']
fg.sync(['**/*.md'], { ignore: ['**/second/**'] }); // ['first/file.md']

:warning: When you write !**/second/**/* it means that the directory will be read, but all the entries will not be included in the results.

You have to understand that if you write the pattern to exclude directories, then the directory will not be read under any circumstances.

How to use UNC path?

You cannot use Uniform Naming Convention (UNC) paths as patterns (due to syntax), but you can use them as cwd directory.

fg.sync('*', { cwd: '\\\\?\\C:\\Python27' /* or //?/C:/Python27 */ });
fg.sync('Python27/*', { cwd: '\\\\?\\C:\\' /* or //?/C:/ */ });

Compatible with node-glob?

node-glob fast-glob
cwd cwd
root
dot dot
nomount
mark markDirectories
nosort
nounique unique
nobrace braceExpansion
noglobstar globstar
noext extglob
nocase caseSensitiveMatch
matchBase baseNameMatch
nodir onlyFiles
ignore ignore
follow followSymbolicLinks
realpath
absolute absolute

Benchmarks

Server

Link: Vultr Bare Metal

You can see results here for latest release.

Nettop

Link: Zotac bi323

You can see results here for latest release.

Changelog

See the Releases section of our GitHub project for changelog for each release version.

License

This software is released under the terms of the MIT license.