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

文件差异内容过多而无法显示
+ 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>

tmt/tiger_frontend - Gogs: Simplico Git Service

Keine Beschreibung

golf 77628cf8bf first comm vor 2 Jahren
..
History.md 77628cf8bf first comm vor 2 Jahren
LICENSE 77628cf8bf first comm vor 2 Jahren
README.md 77628cf8bf first comm vor 2 Jahren
index.js 77628cf8bf first comm vor 2 Jahren
package.json 77628cf8bf first comm vor 2 Jahren

README.md

thenify-all

NPM version Build status Test coverage Dependency Status License Downloads Gittip

Promisifies all the selected functions in an object.

var thenifyAll = require('thenify-all');

var fs = thenifyAll(require('fs'), {}, [
  'readFile',
  'writeFile',
]);

fs.readFile(__filename).then(function (buffer) {
  console.log(buffer.toString());
});

API

var obj = thenifyAll(source, [obj], [methods])

Promisifies all the selected functions in an object.

  • source - the source object for the async functions
  • obj - the destination to set all the promisified methods
  • methods - an array of method names of source

var obj = thenifyAll.withCallback(source, [obj], [methods])

Promisifies all the selected functions in an object and backward compatible with callback.

  • source - the source object for the async functions
  • obj - the destination to set all the promisified methods
  • methods - an array of method names of source

thenifyAll.thenify

Exports thenify this package uses.