@betarena/ad-engine 0.0.5 → 0.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,9 @@
1
+ <svg width="23" height="23" viewBox="0 0 23 23" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
2
+ <rect width="23" height="23" fill="url(#pattern0)"/>
3
+ <defs>
4
+ <pattern id="pattern0" patternContentUnits="objectBoundingBox" width="1" height="1">
5
+ <use xlink:href="#image0_1860_172" transform="scale(0.005)"/>
6
+ </pattern>
7
+ <image id="image0_1860_172" width="200" height="200" xlink:href="data:image/png;base64,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"/>
8
+ </defs>
9
+ </svg>
@@ -0,0 +1,4 @@
1
+ <svg width="15" height="14" viewBox="0 0 15 14" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <path d="M13.1215 1.08392L1.64569 12.5597" stroke="white" stroke-width="1.73876" stroke-linecap="round" stroke-linejoin="round"/>
3
+ <path d="M5.06506 1.02606L13.1213 1.08286L13.1793 9.14027" stroke="white" stroke-width="1.73876" stroke-linecap="round" stroke-linejoin="round"/>
4
+ </svg>
@@ -0,0 +1,10 @@
1
+ export const
2
+ /**
3
+ * @description
4
+ * 📝 Respective Betarena API endpoint for Ad-Engine Data
5
+ * @example
6
+ * - (local) http://localhost:58749
7
+ * - (dev) https://betarena-test-e2748dab12f5.herokuapp.com
8
+ */
9
+ betarenaEndpoint = 'http://localhost:58749'
10
+ ;
@@ -0,0 +1,284 @@
1
+ // ╭──────────────────────────────────────────────────────────────────────────────────╮
2
+ // │ 📌 High Order Component Overview │
3
+ // ┣──────────────────────────────────────────────────────────────────────────────────┫
4
+ // │ ➤ Internal Svelte Code Format :|: V.8.0 │
5
+ // │ ➤ Status :|: 🔒 LOCKED │
6
+ // │ ➤ Author(s) :|: @migbash │
7
+ // ┣──────────────────────────────────────────────────────────────────────────────────┫
8
+ // │ 📝 Description │
9
+ // ┣──────────────────────────────────────────────────────────────────────────────────┫
10
+ // │ > Client 'Svelte/Store' with 'LocalStorage' Persistance │
11
+ // ╰──────────────────────────────────────────────────────────────────────────────────╯
12
+
13
+ /* eslint-disable camelcase */
14
+
15
+ // #region ➤ 📦 Package Imports
16
+
17
+ import { writable } from 'svelte/store';
18
+
19
+ import type { IAdEngineStore } from './types/ad-engine.js';
20
+
21
+ // #endregion ➤ 📦 Package Imports
22
+
23
+ // #region ➤ 📌 VARIABLES
24
+
25
+ const
26
+ /**
27
+ * @description
28
+ * 📣 Target `data` store.
29
+ */
30
+ userSettings: IAdEngineStore
31
+ = {
32
+ isBetarenaAdShownForToday: false,
33
+ advertDateLastShown: null
34
+ }
35
+ ;
36
+
37
+ type IDataProp =
38
+ | 'toggleAdShownState'
39
+ ;
40
+
41
+ // #endregion ➤ 📌 VARIABLES
42
+
43
+ // #region ➤ 🛠️ METHODS
44
+
45
+ /**
46
+ * @author
47
+ * @migbash
48
+ * @summary
49
+ * 🟥 MAIN
50
+ * @description
51
+ * - 📣 Initializer of `svelte/stores` method.
52
+ * - 📣 Uses `localStorage` persistance.
53
+ * @param { string } key
54
+ * 💠 Target `key` to use for `svelte-stores` / `localStorage`.
55
+ * @return
56
+ * 📤 Store logic.
57
+ */
58
+ function createLocalStore
59
+ (
60
+ key: string
61
+ )
62
+ {
63
+ const
64
+ /**
65
+ * @description
66
+ * 📣 Default 'svelte/store' exports.
67
+ */
68
+ {
69
+ subscribe,
70
+ set,
71
+ update
72
+ } = writable
73
+ (
74
+ userSettings
75
+ ),
76
+ /**
77
+ * @description
78
+ * 📣 complementary `store` added methods.
79
+ */
80
+ methods
81
+ = {
82
+ // ╭──────────────────────────────────────────────────────────────────────────────────╮
83
+ // │ 🟦 Local Helper Logic │
84
+ // ╰──────────────────────────────────────────────────────────────────────────────────╯
85
+
86
+ /**
87
+ * @author
88
+ * @migbash
89
+ * @summary
90
+ * - 🟥 MAIN
91
+ * - 🔹 HELPER
92
+ * - IMPORTANT
93
+ * @description
94
+ * 📣 Instantiate `localStorage` data for target `key`.
95
+ * @return { void }
96
+ */
97
+ useLocalStorage:
98
+ (
99
+ ): void =>
100
+ {
101
+ let
102
+ localStore = methods.parseLocalStorage()
103
+ ;
104
+
105
+ // [🐞]
106
+ // console.log('localStore', localStore);
107
+
108
+ // ╭─────
109
+ // │ CHECK :|: for absent localstorage object.
110
+ // ╰─────
111
+ if (localStore == null)
112
+ localStore
113
+ = {
114
+ isBetarenaAdShownForToday: false,
115
+ advertDateLastShown: null,
116
+ }
117
+ ;
118
+ ;
119
+
120
+ // ╭─────
121
+ // │ CHECK :|: for already shown advert
122
+ // ╰─────
123
+ if
124
+ (
125
+ localStore.isBetarenaAdShownForToday
126
+ && localStore.advertDateLastShown?.getDate() != new Date().getDate()
127
+ )
128
+ methods.updateData
129
+ (
130
+ [
131
+ ['toggleAdShownState', undefined]
132
+ ]
133
+ );
134
+ ;
135
+
136
+ methods.setLocalStorage
137
+ (
138
+ localStore
139
+ );
140
+
141
+ return;
142
+ },
143
+
144
+ /**
145
+ * @author
146
+ * @migbash
147
+ * @summary
148
+ * - 🟥 MAIN
149
+ * - 🔹 HELPER
150
+ * - IMPORTANT
151
+ * @description
152
+ * 📣 Retrieves target `localStorage` for target `key`.
153
+ * @return { IAdEngineStore }
154
+ * 📤 Target `user` data object.
155
+ */
156
+ parseLocalStorage:
157
+ (
158
+ ): IAdEngineStore | NullUndef =>
159
+ {
160
+ const
161
+ localStore = localStorage.getItem(key)
162
+ ;
163
+
164
+ if (!localStore) return null;
165
+
166
+ return JSON.parse
167
+ (
168
+ localStore
169
+ );
170
+ },
171
+
172
+ /**
173
+ * @author
174
+ * @migbash
175
+ * @summary
176
+ * - 🟥 MAIN
177
+ * - 🔹 HELPER
178
+ * - IMPORTANT
179
+ * @description
180
+ * 📣 Persists to `localStorage` target data for target `key`.
181
+ * @param { IAdEngineStore } data
182
+ * 💠 **[required]** Target `user` data to be persisted.
183
+ * @return { void }
184
+ */
185
+ setLocalStorage:
186
+ (
187
+ data: IAdEngineStore
188
+ ): void =>
189
+ {
190
+ localStorage.setItem
191
+ (
192
+ key,
193
+ JSON.stringify
194
+ (
195
+ data
196
+ )
197
+ );
198
+
199
+ set
200
+ (
201
+ data
202
+ );
203
+
204
+ return;
205
+ },
206
+
207
+ // ╭──────────────────────────────────────────────────────────────────────────────────╮
208
+ // │ 📣 Main Logic │
209
+ // ╰──────────────────────────────────────────────────────────────────────────────────╯
210
+
211
+ /**
212
+ * @author
213
+ * @migbash
214
+ * @summary
215
+ * - 🔹 HELPER
216
+ * - IMPORTANT
217
+ * @description
218
+ * 📣 Update **target** `list` data of target `properties` to update.
219
+ * @param { [IDataProp, any][] } data
220
+ * 💠 **[required]** Target data to update.
221
+ * @return { void }
222
+ */
223
+ updateData:
224
+ (
225
+ data: [IDataProp, any][]
226
+ ): void =>
227
+ {
228
+ const
229
+ localStore = methods.parseLocalStorage()
230
+ ;
231
+
232
+ if (!localStore) return;
233
+
234
+ // ╭─────
235
+ // │ NOTE: |:| loop over data entries
236
+ // ╰─────
237
+ for (const iterator of data)
238
+ {
239
+ const
240
+ /**
241
+ * @description
242
+ * 📝 Data point `name` to be updated
243
+ */
244
+ dataTarget = iterator[0],
245
+ /**
246
+ * @description
247
+ * 📝 Data point `value` to be set to
248
+ */
249
+ dataPoint = iterator[1]
250
+ ;
251
+
252
+ if (dataTarget == 'toggleAdShownState')
253
+ {
254
+ localStore.isBetarenaAdShownForToday = !localStore.isBetarenaAdShownForToday;
255
+
256
+ if (localStore.isBetarenaAdShownForToday)
257
+ localStore.advertDateLastShown = new Date()
258
+ else
259
+ localStore.advertDateLastShown = null;
260
+ ;
261
+ }
262
+ }
263
+
264
+ methods.setLocalStorage
265
+ (
266
+ localStore
267
+ );
268
+
269
+ return;
270
+ }
271
+ }
272
+ ;
273
+
274
+ return {
275
+ subscribe,
276
+ set,
277
+ update,
278
+ ...methods,
279
+ };
280
+ }
281
+
282
+ // #endregion ➤ 🛠️ METHODS
283
+
284
+ export const betarenaAdEngineStore = createLocalStore('betarena-ad-engine');
@@ -0,0 +1,21 @@
1
+ import { IBetarenaUser } from "@betarena/scores-lib/types/_FIREBASE_.js";
2
+
3
+ /**
4
+ * @author
5
+ * @migbash
6
+ * @summary
7
+ * 🔹 INTERFACE
8
+ */
9
+ export interface IAdEngineStore
10
+ {
11
+ /**
12
+ * @description
13
+ * 📝 Wether target `advert` has been shown for the `24h`
14
+ */
15
+ isBetarenaAdShownForToday: boolean;
16
+ /**
17
+ * @description
18
+ * 📝 Last `timestamp (date)` of shown advert and closed
19
+ */
20
+ advertDateLastShown: Date | null;
21
+ }
@@ -0,0 +1,83 @@
1
+ /**
2
+ * @description
3
+ * 📝 GeoJs Interface
4
+ * @see https://www.geojs.io/docs/v1/endpoints/geo/
5
+ */
6
+ export interface GeoJsResponse
7
+ {
8
+ /**
9
+ * @description
10
+ * 📝 approx. radius around location from IP
11
+ */
12
+ accuracy: number;
13
+ /**
14
+ * @description
15
+ * 📝 autonomous system number associated with the IP
16
+ */
17
+ asn: number;
18
+ /**
19
+ * @description
20
+ * 📝 3-letter continent code
21
+ */
22
+ continent_code: string;
23
+ /**
24
+ * @description
25
+ * 📝 country name in English
26
+ */
27
+ country: string;
28
+ /**
29
+ * @description
30
+ * 📝 2-letter country code
31
+ */
32
+ country_code?: string;
33
+ /**
34
+ * @description
35
+ * 📝 3-letter country code
36
+ */
37
+ country_code3: string;
38
+ /**
39
+ * @description
40
+ * 📝 requested IP
41
+ */
42
+ ip: string;
43
+ /**
44
+ * @description
45
+ * 📝 IP latitude (Note: this is a string due to historic reasons)
46
+ */
47
+ latitude: string;
48
+ /**
49
+ * @description
50
+ * 📝 IP longitude (Note: this is a string due to historic reasons)
51
+ */
52
+ longitude: string;
53
+ /**
54
+ * @description
55
+ * 📝 The organization that the IP is registered to (Note: Unknown is returned when this field is unknown)
56
+ */
57
+ organization: string;
58
+ /**
59
+ * @description
60
+ * 📝 The ASN and organization field combined (Note: this field is depricated)
61
+ */
62
+ organization_name: string;
63
+ /**
64
+ * @description
65
+ * 📝 Area code of IP
66
+ */
67
+ area_code?: string;
68
+ /**
69
+ * @description
70
+ * 📝 City name in English
71
+ */
72
+ city?: string;
73
+ /**
74
+ * @description
75
+ * 📝 Subdivison of the country the IP is within (State, region etc)
76
+ */
77
+ region?: string;
78
+ /**
79
+ * @description
80
+ * 📝 Time zone as specified by the IANA Time Zone Database
81
+ */
82
+ timezone?: string;
83
+ }
@@ -0,0 +1,4 @@
1
+ type NullUndef =
2
+ | null
3
+ | undefined
4
+ ;
@@ -0,0 +1,2 @@
1
+ /// <reference types="svelte" />
2
+ /// <reference types="vite/client" />
@@ -0,0 +1,37 @@
1
+ /**
2
+ * @author
3
+ * @migbash
4
+ * @summary
5
+ * 🟥 MAIN
6
+ * @description
7
+ * 📝 Detect target device type, such as: `mobile` | `tablet` | `desktop`.
8
+ * @returns { string }
9
+ * 📤
10
+ */
11
+ export function detectDeviceType
12
+ (
13
+ ): string
14
+ {
15
+ const
16
+ /**
17
+ * @description
18
+ */
19
+ userAgentObject = navigator.userAgent.toLowerCase(),
20
+ /**
21
+ * @description
22
+ */
23
+ isUserAgentMobile = userAgentObject.includes('mobile'),
24
+ /**
25
+ * @description
26
+ */
27
+ isUserAgentTablet = /tablet|ipad/.test(userAgentObject)
28
+ ;
29
+
30
+ if (isUserAgentMobile)
31
+ return 'mobile';
32
+ else if (isUserAgentTablet)
33
+ return 'tablet';
34
+ else
35
+ return 'desktop';
36
+ ;
37
+ }
@@ -0,0 +1,107 @@
1
+ // #region ➤ 📦 Package Imports
2
+
3
+ import { tryCatchAsyncV2 } from '@betarena/scores-lib/dist/util/util.common.js';
4
+
5
+ // #endregion ➤ 📦 Package Imports
6
+
7
+ interface IResponseError
8
+ {
9
+ /**
10
+ * @description
11
+ * 📝
12
+ */
13
+ error: boolean;
14
+ /**
15
+ * @description
16
+ * 📝
17
+ */
18
+ errorLogs: unknown;
19
+ }
20
+
21
+ /**
22
+ * @author
23
+ * @migbash
24
+ * @summary
25
+ * - 🔹 HELPER
26
+ * - 🟥 IMPORTANT
27
+ * @description
28
+ * 📣 PROXY Fetch type POST
29
+ * @param { string } path
30
+ * 💠 **[required]** `endpoint/url` to fetch data from.
31
+ * @param { T2 } data
32
+ * 💠 [optional] Target data to pass as `body`.
33
+ * @returns { Promise < T1 | NullUndef | unknown | IResponseError > }
34
+ * 📤 Returns an `unkown`.
35
+ */
36
+ export async function postMod
37
+ <
38
+ T1,
39
+ T2
40
+ >
41
+ (
42
+ path: string,
43
+ data: T1
44
+ ): Promise < T2 | IResponseError >
45
+ {
46
+ console.log('path', path);
47
+ console.log('data', data);
48
+
49
+ return await tryCatchAsyncV2
50
+ <
51
+ T2
52
+ >
53
+ (
54
+ async (
55
+ ): Promise < T2 > =>
56
+ {
57
+ const
58
+ /**
59
+ * @description
60
+ * 📝 Target endpoint response.
61
+ */
62
+ res: Response
63
+ = await fetch
64
+ (
65
+ path,
66
+ {
67
+ method: 'POST',
68
+ credentials: 'include',
69
+ body: JSON.stringify(data),
70
+ mode: 'cors',
71
+ headers:
72
+ {
73
+ Accept: 'application/json',
74
+ 'Content-Type': 'application/json'
75
+ }
76
+ }
77
+ ),
78
+ /**
79
+ * @description
80
+ * 📝 Target `json` resonse from `endpoint`.
81
+ */
82
+ resJson = await res.json()
83
+ ;
84
+
85
+ if (!res.ok)
86
+ throw new Error
87
+ (
88
+ JSON.stringify(resJson) ?? 'network response was not ok'
89
+ );
90
+ ;
91
+
92
+ return resJson;
93
+ },
94
+ (
95
+ ex: unknown
96
+ ): IResponseError =>
97
+ {
98
+ // [🐞]
99
+ console.error(`💀 Unhandled :: ${ex}`);
100
+
101
+ return {
102
+ error: true,
103
+ errorLogs: ex
104
+ };
105
+ }
106
+ );
107
+ }
@@ -0,0 +1,34 @@
1
+ import type { GeoJsResponse } from '../types/geojs.js';
2
+
3
+ /**
4
+ * @author
5
+ * @migbash
6
+ * @summary
7
+ * 🟥 MAIN
8
+ * @description
9
+ * 📝 Detect user `geo-location`.
10
+ * @returns { Promise <void> }
11
+ */
12
+ export async function getUserLocation
13
+ (
14
+ ): Promise < GeoJsResponse >
15
+ {
16
+ const
17
+ /**
18
+ * @description
19
+ * 📝 Response from `fetch`
20
+ */
21
+ response = await fetch
22
+ (
23
+ 'https://get.geojs.io/v1/ip/geo.json',
24
+ {
25
+ method: 'GET'
26
+ }
27
+ )
28
+ ;
29
+
30
+ // [🐞]
31
+ // console.log('geoLocation', geoLocation);
32
+
33
+ return await response.json();
34
+ }
package/src/main.ts ADDED
@@ -0,0 +1,17 @@
1
+ import App from './App.svelte'
2
+
3
+ let app
4
+
5
+ if (typeof document === 'undefined') {
6
+ // during server evaluation
7
+ } else {
8
+ // during client's browser evaluation
9
+ app = new App
10
+ (
11
+ {
12
+ target: document.body
13
+ }
14
+ )
15
+ }
16
+
17
+ export default app
package/vite.config.ts CHANGED
@@ -2,6 +2,32 @@ import { defineConfig } from 'vite'
2
2
  import { svelte } from '@sveltejs/vite-plugin-svelte'
3
3
 
4
4
  // https://vitejs.dev/config/
5
- export default defineConfig({
6
- plugins: [svelte()],
7
- })
5
+ export default defineConfig
6
+ (
7
+ (
8
+ {
9
+ command,
10
+ mode
11
+ }
12
+ ) =>
13
+ {
14
+ return {
15
+ plugins:
16
+ [
17
+ svelte()
18
+ ],
19
+
20
+ build:
21
+ {
22
+ rollupOptions:
23
+ {
24
+ output:
25
+ {
26
+ entryFileNames: '[name].js',
27
+ assetFileNames: '[name].[ext]',
28
+ },
29
+ },
30
+ }
31
+ }
32
+ }
33
+ );