@streamlayer/feature-gamification 0.30.3 → 0.32.0

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.
package/lib/deepLink.d.ts CHANGED
@@ -1,7 +1,12 @@
1
1
  import type { Transport } from '@streamlayer/sdk-web-api';
2
2
  import { ReadableAtom } from 'nanostores';
3
+ type DeepLinkData = {
4
+ data?: string;
5
+ loading?: boolean;
6
+ error?: string;
7
+ };
3
8
  export declare const deepLink: (transport: Transport, $eventId: ReadableAtom<string | undefined>, $userId: ReadableAtom<string | undefined>) => {
4
- $store: import("@nanostores/query").FetcherStore<import("@streamlayer/sl-eslib/sdkSettings/client/client_pb").DeepLink | undefined, any>;
9
+ $store: import("nanostores").MapStore<DeepLinkData>;
5
10
  fetch: typeof fetch;
6
- desktopLink: string;
7
11
  };
12
+ export {};
package/lib/deepLink.js CHANGED
@@ -1,6 +1,23 @@
1
- import { $deepLink } from './queries/deepLink';
1
+ import { createMapStore } from '@streamlayer/sdk-web-interfaces';
2
+ import { onMount } from 'nanostores';
3
+ import { $deepLink, generateShortLink } from './queries/deepLink';
2
4
  export const deepLink = (transport, $eventId, $userId) => {
3
- const $store = $deepLink(transport, [$eventId]);
4
- const desktopLink = `${window.location.host + window.location.pathname}%23sl_eid=${$eventId.get()}&sl_uid=${$userId.get()}`;
5
- return { $store, fetch, desktopLink };
5
+ const $store = createMapStore({});
6
+ onMount($store, () => {
7
+ const $branchLink = $deepLink(transport, [$eventId]);
8
+ const cancel = $branchLink.subscribe(async ({ data }) => {
9
+ const mobileDeepLink = data?.url;
10
+ if (mobileDeepLink) {
11
+ $store.setKey('loading', true);
12
+ const desktopLink = `${window.location.host + window.location.pathname}%23sl_eid=${$eventId.get()}&sl_uid=${$userId.get()}`;
13
+ const shortLink = await generateShortLink(transport, { web: desktopLink, mobile: mobileDeepLink });
14
+ $store.set({
15
+ data: shortLink.data?.link,
16
+ loading: false,
17
+ });
18
+ }
19
+ });
20
+ return cancel;
21
+ });
22
+ return { $store, fetch };
6
23
  };
@@ -7,11 +7,12 @@ type LeaderboardOptions = {
7
7
  type LeaderboardStore = {
8
8
  data?: LeaderboardItem[];
9
9
  loading?: boolean;
10
+ hasMore: boolean;
10
11
  error?: string;
11
12
  };
12
13
  export declare const leaderboard: (transport: Transport, $eventId: ReadableAtom<string | undefined>, options?: LeaderboardOptions) => {
13
14
  $store: import("nanostores").MapStore<LeaderboardStore>;
14
- fetchMore: () => void;
15
+ fetchMore: (page?: number) => void;
15
16
  invalidate: () => void;
16
17
  };
17
18
  export {};
@@ -1,12 +1,17 @@
1
1
  import { createSingleStore, createMapStore } from '@streamlayer/sdk-web-interfaces';
2
+ import { onMount } from 'nanostores';
2
3
  import { createLeaderboardListFetch } from './queries/leaderboard';
3
4
  const defaultOptions = {
4
5
  pageSize: 10,
5
6
  };
6
7
  export const leaderboard = (transport, $eventId, options) => {
8
+ let maxPage = 0;
7
9
  const $pagination = createSingleStore({ pageSize: options?.pageSize || defaultOptions.pageSize, page: 0 });
8
- const $store = createMapStore({ data: [], loading: undefined, error: undefined });
10
+ const $store = createMapStore({ data: [], hasMore: true, loading: undefined, error: undefined });
9
11
  const fetch = createLeaderboardListFetch(transport);
12
+ /**
13
+ * Refetch leaderboard data, reset pagination
14
+ */
10
15
  const refetch = async (eventId) => {
11
16
  if (eventId) {
12
17
  $store.setKey('loading', true);
@@ -15,34 +20,58 @@ export const leaderboard = (transport, $eventId, options) => {
15
20
  pagination: { page: 0, pageSize: options?.pageSize || defaultOptions.pageSize },
16
21
  };
17
22
  const newData = await fetch(request);
18
- $store.set({ data: newData.data.map((item) => item.attributes), loading: false });
23
+ $store.set({
24
+ data: newData.data.map((item) => item.attributes),
25
+ hasMore: true,
26
+ loading: false,
27
+ });
28
+ if (newData.meta) {
29
+ maxPage = Math.round(newData.meta.count / newData.meta.pageSize);
30
+ }
19
31
  $pagination.set(request.pagination);
20
32
  }
21
33
  };
22
- $eventId.listen(refetch);
23
34
  const invalidate = () => {
24
35
  void refetch($eventId.get());
25
36
  };
26
- $pagination.listen(async (pagination) => {
27
- const eventId = $eventId.get();
28
- const prevDataLength = $store.get().data?.length || 0;
29
- if (pagination.page > 0 && eventId && prevDataLength >= pagination.page * pagination.pageSize) {
30
- $store.setKey('loading', true);
31
- const request = {
32
- eventId: eventId,
33
- pagination,
34
- };
35
- const newData = await fetch(request);
36
- const prevData = $store.get().data || [];
37
- $store.set({
38
- data: [...prevData, ...newData.data.map((item) => item.attributes)],
39
- loading: false,
40
- });
41
- }
42
- });
43
- const fetchMore = () => {
37
+ /**
38
+ * Whether there is more data to fetch
39
+ */
40
+ const fetchMore = (page) => {
44
41
  const pagination = $pagination.get();
45
- $pagination.set({ ...pagination, page: pagination.page + 1 });
42
+ const nextPage = page || pagination.page + 1;
43
+ if (nextPage <= maxPage) {
44
+ $pagination.set({ ...pagination, page: nextPage });
45
+ }
46
46
  };
47
+ onMount($store, () => {
48
+ const cancelRefetchListener = $eventId.listen(refetch);
49
+ const cancelPaginationListener = $pagination.listen(async (pagination) => {
50
+ const eventId = $eventId.get();
51
+ if (pagination.page > 0 && eventId) {
52
+ if (pagination.page < maxPage) {
53
+ $store.setKey('loading', true);
54
+ const request = {
55
+ eventId: eventId,
56
+ pagination,
57
+ };
58
+ const newData = await fetch(request);
59
+ const prevData = $store.get().data || [];
60
+ $store.set({
61
+ data: [...prevData, ...newData.data.map((item) => item.attributes)],
62
+ loading: false,
63
+ hasMore: true,
64
+ });
65
+ }
66
+ else {
67
+ $store.setKey('hasMore', false);
68
+ }
69
+ }
70
+ });
71
+ return () => {
72
+ cancelRefetchListener();
73
+ cancelPaginationListener();
74
+ };
75
+ });
47
76
  return { $store, fetchMore, invalidate };
48
77
  };
@@ -3,4 +3,8 @@ import { ReadableAtom } from 'nanostores';
3
3
  import { DeepLink } from '@streamlayer/sl-eslib/sdkSettings/client/client_pb';
4
4
  type EventId = ReadableAtom<string | undefined>;
5
5
  export declare const $deepLink: (transport: Transport, params: [EventId]) => import("@nanostores/query").FetcherStore<DeepLink | undefined, any>;
6
+ export declare const generateShortLink: (transport: Transport, { web, mobile }: {
7
+ web: string;
8
+ mobile: string;
9
+ }) => Promise<import("@streamlayer/sl-eslib/shortLinks/client_pb").GenerateResponse>;
6
10
  export {};
@@ -1,4 +1,5 @@
1
1
  import { Client } from '@streamlayer/sl-eslib/sdkSettings/client/client_connect';
2
+ import { Client as ShortLinkClient } from '@streamlayer/sl-eslib/shortLinks/client_connect';
2
3
  export const $deepLink = (transport, params) => {
3
4
  const { client, queryKey } = transport.createPromiseClient(Client, {
4
5
  method: 'generateDeepLink',
@@ -14,3 +15,7 @@ export const $deepLink = (transport, params) => {
14
15
  },
15
16
  });
16
17
  };
18
+ export const generateShortLink = (transport, { web, mobile }) => {
19
+ const { client } = transport.createPromiseClient(ShortLinkClient, { method: 'generate' });
20
+ return client.generate({ web, mobile });
21
+ };
package/package.json CHANGED
@@ -1,17 +1,17 @@
1
1
  {
2
2
  "name": "@streamlayer/feature-gamification",
3
- "version": "0.30.3",
3
+ "version": "0.32.0",
4
4
  "peerDependencies": {
5
5
  "@bufbuild/protobuf": "^1.4.2",
6
- "@streamlayer/sl-eslib": "^5.61.0",
6
+ "@streamlayer/sl-eslib": "^5.61.1",
7
7
  "@fastify/deepmerge": "*",
8
8
  "nanostores": "^0.9.5",
9
- "@streamlayer/sdk-web-api": "^0.1.0",
10
- "@streamlayer/sdk-web-core": "^0.1.0",
11
- "@streamlayer/sdk-web-interfaces": "^0.18.19",
12
- "@streamlayer/sdk-web-notifications": "^0.0.3",
13
- "@streamlayer/sdk-web-storage": "^0.0.4",
9
+ "@streamlayer/sdk-web-api": "^0.0.1",
10
+ "@streamlayer/sdk-web-core": "^0.0.1",
11
+ "@streamlayer/sdk-web-interfaces": "^0.18.21",
14
12
  "@streamlayer/sdk-web-logger": "^0.0.1",
13
+ "@streamlayer/sdk-web-notifications": "^0.0.5",
14
+ "@streamlayer/sdk-web-storage": "^0.0.4",
15
15
  "@streamlayer/sdk-web-types": "^0.1.0"
16
16
  },
17
17
  "devDependencies": {