@adventurelabs/scout-core 1.5.4 → 2.0.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/README.md +47 -0
- package/dist/api_keys/actions.d.ts +0 -1
- package/dist/api_keys/actions.js +0 -14
- package/dist/client/index.d.ts +75 -0
- package/dist/client/index.js +82 -0
- package/dist/constants/index.d.ts +1 -0
- package/dist/constants/index.js +1 -0
- package/dist/helpers/analysis_usage/jobs_server.d.ts +25 -0
- package/dist/helpers/analysis_usage/jobs_server.js +10 -0
- package/dist/helpers/analysis_usage/tasks_server.d.ts +63 -0
- package/dist/helpers/analysis_usage/tasks_server.js +14 -0
- package/dist/helpers/artifacts.d.ts +0 -1
- package/dist/helpers/artifacts.js +10 -147
- package/dist/helpers/artifacts.queries.d.ts +26 -0
- package/dist/helpers/{artifacts.internal.js → artifacts.queries.js} +24 -41
- package/dist/helpers/auth.d.ts +1 -1
- package/dist/helpers/auth.js +2 -3
- package/dist/helpers/auth_server.d.ts +2 -0
- package/dist/helpers/auth_server.js +10 -0
- package/dist/helpers/certificates_server.d.ts +101 -0
- package/dist/helpers/certificates_server.js +42 -0
- package/dist/helpers/chat.d.ts +1 -2
- package/dist/helpers/chat.js +3 -38
- package/dist/helpers/chat.queries.d.ts +13 -0
- package/dist/helpers/chat.queries.js +39 -0
- package/dist/helpers/client_abilities_jwt_keys.js +0 -1
- package/dist/helpers/client_abilities_token_server.d.ts +1 -0
- package/dist/helpers/client_abilities_token_server.js +5 -2
- package/dist/helpers/connectivity.d.ts +1 -5
- package/dist/helpers/connectivity.js +7 -140
- package/dist/helpers/connectivity.queries.d.ts +18 -0
- package/dist/helpers/connectivity.queries.js +121 -0
- package/dist/helpers/contacts_server.d.ts +63 -0
- package/dist/helpers/contacts_server.js +18 -0
- package/dist/helpers/deviceTransfer.js +2 -11
- package/dist/helpers/deviceTransfer.queries.d.ts +4 -0
- package/dist/helpers/deviceTransfer.queries.js +11 -0
- package/dist/helpers/devices.js +4 -61
- package/dist/helpers/devices.queries.d.ts +4 -1
- package/dist/helpers/devices.queries.js +52 -0
- package/dist/helpers/document_templates.js +6 -52
- package/dist/helpers/document_templates.queries.d.ts +9 -0
- package/dist/helpers/document_templates.queries.js +56 -0
- package/dist/helpers/documents_server.d.ts +226 -0
- package/dist/helpers/documents_server.js +38 -0
- package/dist/helpers/email.d.ts +0 -6
- package/dist/helpers/email.js +1 -19
- package/dist/helpers/embeddings.d.ts +0 -5
- package/dist/helpers/embeddings.js +2 -19
- package/dist/helpers/embeddings.queries.d.ts +7 -0
- package/dist/helpers/{embeddings.internal.js → embeddings.queries.js} +2 -2
- package/dist/helpers/eventUtils.d.ts +3 -12
- package/dist/helpers/eventUtils.js +0 -10
- package/dist/helpers/events.d.ts +0 -1
- package/dist/helpers/events.js +7 -107
- package/dist/helpers/events.queries.d.ts +17 -0
- package/dist/helpers/{events.internal.js → events.queries.js} +24 -15
- package/dist/helpers/health_metrics.js +3 -38
- package/dist/helpers/health_metrics.queries.d.ts +12 -0
- package/dist/helpers/health_metrics.queries.js +39 -0
- package/dist/helpers/heartbeats.js +4 -83
- package/dist/helpers/heartbeats.queries.d.ts +11 -0
- package/dist/helpers/heartbeats.queries.js +76 -0
- package/dist/helpers/herd_allowed_domains.js +2 -12
- package/dist/helpers/{herd_allowed_domains_internal.d.ts → herd_allowed_domains.queries.d.ts} +1 -1
- package/dist/helpers/{herd_allowed_domains_internal.js → herd_allowed_domains.queries.js} +2 -2
- package/dist/helpers/herd_credentials_server.d.ts +76 -0
- package/dist/helpers/herd_credentials_server.js +22 -0
- package/dist/helpers/herd_modules.queries.js +10 -7
- package/dist/helpers/herd_roles.js +13 -148
- package/dist/helpers/herd_roles.queries.d.ts +18 -0
- package/dist/helpers/{herd_roles_internal.js → herd_roles.queries.js} +28 -28
- package/dist/helpers/herds.js +5 -47
- package/dist/helpers/herds.queries.d.ts +8 -1
- package/dist/helpers/herds.queries.js +48 -0
- package/dist/helpers/invitations.js +7 -58
- package/dist/helpers/invitations.queries.d.ts +10 -0
- package/dist/helpers/{invitations_internal.js → invitations.queries.js} +12 -12
- package/dist/helpers/issuers.js +6 -52
- package/dist/helpers/issuers.queries.d.ts +9 -0
- package/dist/helpers/issuers.queries.js +53 -0
- package/dist/helpers/layers.js +2 -20
- package/dist/helpers/layers.queries.d.ts +2 -1
- package/dist/helpers/layers.queries.js +9 -13
- package/dist/helpers/lifecycle_server.d.ts +175 -0
- package/dist/helpers/lifecycle_server.js +38 -0
- package/dist/helpers/localizations.js +5 -42
- package/dist/helpers/localizations.queries.d.ts +8 -0
- package/dist/helpers/localizations.queries.js +45 -0
- package/dist/helpers/maintenance_requests_server.d.ts +124 -0
- package/dist/helpers/maintenance_requests_server.js +34 -0
- package/dist/helpers/manufacturers.js +5 -43
- package/dist/helpers/manufacturers.queries.d.ts +10 -0
- package/dist/helpers/manufacturers.queries.js +46 -0
- package/dist/helpers/media_urls.d.ts +13 -0
- package/dist/helpers/media_urls.js +21 -0
- package/dist/helpers/models.js +8 -80
- package/dist/helpers/models.queries.d.ts +13 -0
- package/dist/helpers/models.queries.js +79 -0
- package/dist/helpers/observations_server.d.ts +51 -0
- package/dist/helpers/observations_server.js +22 -0
- package/dist/helpers/operating_contexts.js +39 -154
- package/dist/helpers/operating_contexts.queries.d.ts +48 -0
- package/dist/helpers/operating_contexts.queries.js +223 -0
- package/dist/helpers/operators.js +4 -57
- package/dist/helpers/operators.queries.d.ts +7 -0
- package/dist/helpers/operators.queries.js +55 -0
- package/dist/helpers/parts.d.ts +0 -87
- package/dist/helpers/parts.js +4 -90
- package/dist/helpers/parts_server.d.ts +260 -0
- package/dist/helpers/parts_server.js +71 -0
- package/dist/helpers/pins_server.d.ts +118 -0
- package/dist/helpers/pins_server.js +38 -0
- package/dist/helpers/plans.js +4 -56
- package/dist/helpers/plans.queries.d.ts +4 -1
- package/dist/helpers/plans.queries.js +39 -12
- package/dist/helpers/points_for_user_server.d.ts +9 -0
- package/dist/helpers/points_for_user_server.js +14 -0
- package/dist/helpers/product_compatibilities.js +6 -78
- package/dist/helpers/product_compatibilities.queries.d.ts +9 -0
- package/dist/helpers/product_compatibilities.queries.js +83 -0
- package/dist/helpers/product_numbers.js +6 -55
- package/dist/helpers/product_numbers.queries.d.ts +9 -0
- package/dist/helpers/product_numbers.queries.js +58 -0
- package/dist/helpers/products.js +6 -54
- package/dist/helpers/products.queries.d.ts +11 -0
- package/dist/helpers/products.queries.js +58 -0
- package/dist/helpers/providers.js +5 -71
- package/dist/helpers/providers.queries.d.ts +5 -1
- package/dist/helpers/providers.queries.js +52 -11
- package/dist/helpers/pubsub_token_server.d.ts +1 -0
- package/dist/helpers/pubsub_token_server.js +5 -2
- package/dist/helpers/segmentations_sam3.js +5 -78
- package/dist/helpers/segmentations_sam3.queries.d.ts +16 -0
- package/dist/helpers/segmentations_sam3.queries.js +81 -0
- package/dist/helpers/sensor_poses_server.d.ts +98 -0
- package/dist/helpers/sensor_poses_server.js +26 -0
- package/dist/helpers/session_incidents_server.d.ts +106 -0
- package/dist/helpers/session_incidents_server.js +22 -0
- package/dist/helpers/session_summaries.d.ts +2 -0
- package/dist/helpers/session_summaries.js +7 -23
- package/dist/helpers/session_summaries.queries.d.ts +6 -3
- package/dist/helpers/session_summaries.queries.js +27 -0
- package/dist/helpers/sessions.js +8 -122
- package/dist/helpers/sessions.queries.d.ts +14 -2
- package/dist/helpers/sessions.queries.js +88 -1
- package/dist/helpers/storage.js +0 -1
- package/dist/helpers/supabase_auth.d.ts +6 -0
- package/dist/helpers/supabase_auth.js +37 -0
- package/dist/helpers/tags.d.ts +0 -1
- package/dist/helpers/tags.js +13 -559
- package/dist/helpers/tags.queries.d.ts +33 -0
- package/dist/helpers/tags.queries.js +454 -0
- package/dist/helpers/user_credentials_server.d.ts +76 -0
- package/dist/helpers/user_credentials_server.js +22 -0
- package/dist/helpers/users.d.ts +2 -2
- package/dist/helpers/users.js +8 -107
- package/dist/helpers/users.queries.d.ts +9 -1
- package/dist/helpers/users.queries.js +107 -0
- package/dist/helpers/versions_software.d.ts +3 -1
- package/dist/helpers/versions_software.js +24 -0
- package/dist/helpers/versions_software_server.d.ts +83 -4
- package/dist/helpers/versions_software_server.js +23 -50
- package/dist/helpers/zones.d.ts +1 -16
- package/dist/helpers/zones.js +4 -104
- package/dist/helpers/zones.queries.d.ts +6 -0
- package/dist/helpers/zones.queries.js +78 -0
- package/dist/hooks/useAuthorizedRealtimeTopics.js +8 -2
- package/dist/hooks/useInfiniteQuery.js +18 -14
- package/dist/hooks/useScoutRealtimeBroadcast.js +8 -6
- package/dist/hooks/useScoutRealtimeDocuments.js +3 -2
- package/dist/hooks/useScoutRefresh.d.ts +9 -25
- package/dist/hooks/useScoutRefresh.js +33 -213
- package/dist/providers/ScoutRefreshProvider.d.ts +1 -1
- package/dist/providers/ScoutRefreshProvider.js +56 -13
- package/dist/server/index.d.ts +77 -0
- package/dist/server/index.js +79 -0
- package/dist/server/middleware.d.ts +2 -0
- package/dist/server/middleware.js +2 -0
- package/dist/server/supabase.d.ts +2 -0
- package/dist/server/supabase.js +2 -0
- package/dist/store/api.d.ts +40 -40
- package/dist/store/api.js +38 -109
- package/dist/store/configureStore.d.ts +0 -55
- package/dist/store/configureStore.js +1 -8
- package/dist/store/hooks.js +1 -0
- package/dist/supabase/client.d.ts +3 -0
- package/dist/supabase/client.js +10 -0
- package/dist/supabase/middleware.d.ts +1 -0
- package/dist/supabase/middleware.js +6 -20
- package/dist/supabase/server.d.ts +7 -2
- package/dist/supabase/server.js +13 -1
- package/dist/types/db.d.ts +2 -2
- package/dist/types/index.d.ts +5 -0
- package/dist/types/index.js +5 -0
- package/package.json +53 -4
- package/dist/api_keys/index.d.ts +0 -1
- package/dist/api_keys/index.js +0 -1
- package/dist/helpers/artifacts.internal.d.ts +0 -22
- package/dist/helpers/client_abilities_jwt_keys_internal.d.ts +0 -9
- package/dist/helpers/client_abilities_jwt_keys_internal.js +0 -20
- package/dist/helpers/connectivity.internal.d.ts +0 -10
- package/dist/helpers/connectivity.internal.js +0 -47
- package/dist/helpers/credentials.d.ts +0 -9
- package/dist/helpers/credentials.js +0 -92
- package/dist/helpers/embeddings.internal.d.ts +0 -5
- package/dist/helpers/events.internal.d.ts +0 -13
- package/dist/helpers/herd_roles_internal.d.ts +0 -18
- package/dist/helpers/index.d.ts +0 -56
- package/dist/helpers/index.js +0 -56
- package/dist/helpers/invitations_internal.d.ts +0 -10
- package/dist/helpers/versions_software_internal.d.ts +0 -6
- package/dist/helpers/versions_software_internal.js +0 -53
- package/dist/hooks/useDeviceDisplayName.d.ts +0 -8
- package/dist/hooks/useDeviceDisplayName.js +0 -49
- package/dist/index.d.ts +0 -108
- package/dist/index.js +0 -114
- package/dist/supabase/index.d.ts +0 -2
- package/dist/supabase/index.js +0 -2
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
import { SupabaseClient } from "@supabase/supabase-js";
|
|
2
|
-
import { IUserAndRole } from "../types/db";
|
|
2
|
+
import { IUser, IUserAndRole, IUserProfileRow, IUserRolePerHerd } from "../types/db";
|
|
3
3
|
import { Database } from "../types/supabase";
|
|
4
4
|
import { IWebResponseCompatible } from "../types/requests";
|
|
5
|
+
export type UserProfileUpdate = Database["public"]["Tables"]["users"]["Update"];
|
|
6
|
+
export declare function get_user_roles_query(client: SupabaseClient<Database>, herd_id: number): Promise<IWebResponseCompatible<IUserRolePerHerd[]>>;
|
|
7
|
+
export declare function get_user_query(client: SupabaseClient<Database>): Promise<IWebResponseCompatible<IUser | null>>;
|
|
8
|
+
export declare function get_users_with_herd_access_query(client: SupabaseClient<Database>, herd_id: number): Promise<IWebResponseCompatible<IUserAndRole[]>>;
|
|
5
9
|
export declare function get_users_with_herd_access_batch_query(client: SupabaseClient<Database>, herd_ids: number[]): Promise<IWebResponseCompatible<Record<number, IUserAndRole[]>>>;
|
|
10
|
+
export declare function upsert_user_herd_role_query(client: SupabaseClient<Database>, herd_id: number, username: string, herd_role_id: number): Promise<IWebResponseCompatible<IUserAndRole | null>>;
|
|
11
|
+
export declare function update_user_profile_query(client: SupabaseClient<Database>, user_id: string, patch: UserProfileUpdate): Promise<IWebResponseCompatible<IUserProfileRow | null>>;
|
|
12
|
+
export declare function leave_herd_for_current_user_query(client: SupabaseClient<Database>, herd_id: number): Promise<IWebResponseCompatible<IUserRolePerHerd | null>>;
|
|
13
|
+
export declare function remove_user_from_herd_for_admin_query(client: SupabaseClient<Database>, herd_id: number, user_id: string): Promise<IWebResponseCompatible<IUserRolePerHerd | null>>;
|
|
@@ -1,4 +1,42 @@
|
|
|
1
1
|
import { EnumWebResponse, IWebResponse, } from "../types/requests";
|
|
2
|
+
export async function get_user_roles_query(client, herd_id) {
|
|
3
|
+
const { data } = await client
|
|
4
|
+
.from("users_roles_per_herd")
|
|
5
|
+
.select("*")
|
|
6
|
+
.eq("herd_id", herd_id);
|
|
7
|
+
if (!data) {
|
|
8
|
+
return {
|
|
9
|
+
status: EnumWebResponse.ERROR,
|
|
10
|
+
msg: `No user role found for herd ${herd_id}`,
|
|
11
|
+
data: null,
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
return IWebResponse.success(data).to_compatible();
|
|
15
|
+
}
|
|
16
|
+
export async function get_user_query(client) {
|
|
17
|
+
const { data } = await client.auth.getUser();
|
|
18
|
+
const new_user = data.user;
|
|
19
|
+
return IWebResponse.success(new_user).to_compatible();
|
|
20
|
+
}
|
|
21
|
+
export async function get_users_with_herd_access_query(client, herd_id) {
|
|
22
|
+
const { data, error } = await client
|
|
23
|
+
.from("users_roles_per_herd")
|
|
24
|
+
.select(`
|
|
25
|
+
herd_role_id,
|
|
26
|
+
herd_roles (*),
|
|
27
|
+
users!users_roles_per_herd_user_id_fkey (*)
|
|
28
|
+
`)
|
|
29
|
+
.eq("herd_id", herd_id);
|
|
30
|
+
if (error) {
|
|
31
|
+
return { status: EnumWebResponse.ERROR, msg: error.message, data: null };
|
|
32
|
+
}
|
|
33
|
+
const transformedData = (data ?? []).map((item) => ({
|
|
34
|
+
user: item.users,
|
|
35
|
+
herd_role_id: item.herd_role_id,
|
|
36
|
+
herd_role: item.herd_roles,
|
|
37
|
+
}));
|
|
38
|
+
return IWebResponse.success(transformedData).to_compatible();
|
|
39
|
+
}
|
|
2
40
|
export async function get_users_with_herd_access_batch_query(client, herd_ids) {
|
|
3
41
|
var _a;
|
|
4
42
|
if (herd_ids.length === 0) {
|
|
@@ -28,3 +66,72 @@ export async function get_users_with_herd_access_batch_query(client, herd_ids) {
|
|
|
28
66
|
}
|
|
29
67
|
return IWebResponse.success(grouped).to_compatible();
|
|
30
68
|
}
|
|
69
|
+
export async function upsert_user_herd_role_query(client, herd_id, username, herd_role_id) {
|
|
70
|
+
const { data: user, error: user_error } = await client
|
|
71
|
+
.from("users")
|
|
72
|
+
.select("*")
|
|
73
|
+
.eq("username", username)
|
|
74
|
+
.single();
|
|
75
|
+
if (user_error) {
|
|
76
|
+
return IWebResponse.error("Unable to fetch user with provided username").to_compatible();
|
|
77
|
+
}
|
|
78
|
+
if (!user) {
|
|
79
|
+
return IWebResponse.error("User not found").to_compatible();
|
|
80
|
+
}
|
|
81
|
+
const { data: herdRole, error: role_error } = await client
|
|
82
|
+
.from("herd_roles")
|
|
83
|
+
.select("*")
|
|
84
|
+
.eq("id", herd_role_id)
|
|
85
|
+
.eq("herd_id", herd_id)
|
|
86
|
+
.single();
|
|
87
|
+
if (role_error || !herdRole) {
|
|
88
|
+
return IWebResponse.error("Invalid herd role for this herd").to_compatible();
|
|
89
|
+
}
|
|
90
|
+
const { error } = await client.from("users_roles_per_herd").upsert({
|
|
91
|
+
user_id: user.id,
|
|
92
|
+
herd_id,
|
|
93
|
+
herd_role_id,
|
|
94
|
+
});
|
|
95
|
+
if (error) {
|
|
96
|
+
return IWebResponse.error("Unable to update or add user with provided username. Ensure you have sufficient permissions.").to_compatible();
|
|
97
|
+
}
|
|
98
|
+
return IWebResponse.success({
|
|
99
|
+
user,
|
|
100
|
+
herd_role_id,
|
|
101
|
+
herd_role: herdRole,
|
|
102
|
+
}).to_compatible();
|
|
103
|
+
}
|
|
104
|
+
export async function update_user_profile_query(client, user_id, patch) {
|
|
105
|
+
const { data, error } = await client
|
|
106
|
+
.from("users")
|
|
107
|
+
.update(patch)
|
|
108
|
+
.eq("id", user_id)
|
|
109
|
+
.select("*")
|
|
110
|
+
.single();
|
|
111
|
+
if (error) {
|
|
112
|
+
return IWebResponse.error(error.message).to_compatible();
|
|
113
|
+
}
|
|
114
|
+
if (!data) {
|
|
115
|
+
return IWebResponse.error("User not found or profile update failed").to_compatible();
|
|
116
|
+
}
|
|
117
|
+
return IWebResponse.success(data).to_compatible();
|
|
118
|
+
}
|
|
119
|
+
export async function leave_herd_for_current_user_query(client, herd_id) {
|
|
120
|
+
const { data, error } = await client.rpc("leave_herd_for_current_user", {
|
|
121
|
+
p_herd_id: herd_id,
|
|
122
|
+
});
|
|
123
|
+
if (error) {
|
|
124
|
+
return IWebResponse.error(error.message).to_compatible();
|
|
125
|
+
}
|
|
126
|
+
return IWebResponse.success(data).to_compatible();
|
|
127
|
+
}
|
|
128
|
+
export async function remove_user_from_herd_for_admin_query(client, herd_id, user_id) {
|
|
129
|
+
const { data, error } = await client.rpc("remove_user_from_herd_for_admin", {
|
|
130
|
+
p_herd_id: herd_id,
|
|
131
|
+
p_user_id: user_id,
|
|
132
|
+
});
|
|
133
|
+
if (error) {
|
|
134
|
+
return IWebResponse.error(error.message).to_compatible();
|
|
135
|
+
}
|
|
136
|
+
return IWebResponse.success(data).to_compatible();
|
|
137
|
+
}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { Database } from "../types/supabase";
|
|
2
|
-
import { IVersionsSoftware, VersionsSoftwareInsert } from "../types/db";
|
|
2
|
+
import { IVersionsSoftware, IVersionsSoftwareWithBuildUrl, VersionsSoftwareInsert } from "../types/db";
|
|
3
3
|
import { IWebResponseCompatible } from "../types/requests";
|
|
4
4
|
import { SupabaseClient } from "@supabase/supabase-js";
|
|
5
5
|
export declare function get_versions_software(client: SupabaseClient<Database>): Promise<IWebResponseCompatible<IVersionsSoftware[]>>;
|
|
6
6
|
export declare function get_versions_software_by_system(client: SupabaseClient<Database>, system: string): Promise<IWebResponseCompatible<IVersionsSoftware[]>>;
|
|
7
|
+
export declare function get_versions_software_with_build_urls(client: SupabaseClient<Database>): Promise<IWebResponseCompatible<IVersionsSoftwareWithBuildUrl[]>>;
|
|
8
|
+
export declare function get_versions_software_by_system_with_build_urls(client: SupabaseClient<Database>, system: string): Promise<IWebResponseCompatible<IVersionsSoftwareWithBuildUrl[]>>;
|
|
7
9
|
export declare function create_version_software(client: SupabaseClient<Database>, newVersionSoftware: VersionsSoftwareInsert): Promise<IWebResponseCompatible<IVersionsSoftware | null>>;
|
|
8
10
|
export declare function update_version_software(client: SupabaseClient<Database>, version_id: number, updatedVersionSoftware: Partial<VersionsSoftwareInsert>): Promise<IWebResponseCompatible<IVersionsSoftware | null>>;
|
|
9
11
|
export declare function delete_version_software(client: SupabaseClient<Database>, version_id: number): Promise<IWebResponseCompatible<IVersionsSoftware | null>>;
|
|
@@ -1,4 +1,14 @@
|
|
|
1
1
|
import { IWebResponse } from "../types/requests";
|
|
2
|
+
import { createSignedUrlMap } from "./media_urls";
|
|
3
|
+
async function attachBuildArtifactUrls(client, versions) {
|
|
4
|
+
const urlsByPath = await createSignedUrlMap(client, versions.map((version) => version.path_build_artifact));
|
|
5
|
+
return versions.map((version) => ({
|
|
6
|
+
...version,
|
|
7
|
+
build_artifact_url: version.path_build_artifact
|
|
8
|
+
? urlsByPath.get(version.path_build_artifact) ?? null
|
|
9
|
+
: null,
|
|
10
|
+
}));
|
|
11
|
+
}
|
|
2
12
|
export async function get_versions_software(client) {
|
|
3
13
|
const { data, error } = await client
|
|
4
14
|
.from("versions_software")
|
|
@@ -26,6 +36,20 @@ export async function get_versions_software_by_system(client, system) {
|
|
|
26
36
|
}
|
|
27
37
|
return IWebResponse.success(data).to_compatible();
|
|
28
38
|
}
|
|
39
|
+
export async function get_versions_software_with_build_urls(client) {
|
|
40
|
+
const response = await get_versions_software(client);
|
|
41
|
+
if (!response.data) {
|
|
42
|
+
return IWebResponse.error(response.msg ?? "No software versions found").to_compatible();
|
|
43
|
+
}
|
|
44
|
+
return IWebResponse.success(await attachBuildArtifactUrls(client, response.data)).to_compatible();
|
|
45
|
+
}
|
|
46
|
+
export async function get_versions_software_by_system_with_build_urls(client, system) {
|
|
47
|
+
const response = await get_versions_software_by_system(client, system);
|
|
48
|
+
if (!response.data) {
|
|
49
|
+
return IWebResponse.error(response.msg ?? `No software versions found for system: ${system}`).to_compatible();
|
|
50
|
+
}
|
|
51
|
+
return IWebResponse.success(await attachBuildArtifactUrls(client, response.data)).to_compatible();
|
|
52
|
+
}
|
|
29
53
|
export async function create_version_software(client, newVersionSoftware) {
|
|
30
54
|
const { data, error } = await client
|
|
31
55
|
.from("versions_software")
|
|
@@ -1,4 +1,83 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
import { VersionsSoftwareInsert } from "../types/db";
|
|
2
|
+
export declare function server_get_versions_software(): Promise<import("../types").IWebResponseCompatible<{
|
|
3
|
+
broken: boolean;
|
|
4
|
+
commit_hash: string | null;
|
|
5
|
+
created_at: string;
|
|
6
|
+
description: string;
|
|
7
|
+
hyperlink: string | null;
|
|
8
|
+
id: number;
|
|
9
|
+
min: boolean;
|
|
10
|
+
path_build_artifact: string | null;
|
|
11
|
+
pre: boolean;
|
|
12
|
+
stable: boolean;
|
|
13
|
+
system: string;
|
|
14
|
+
title: string | null;
|
|
15
|
+
updated_at: string | null;
|
|
16
|
+
version: string;
|
|
17
|
+
}[]>>;
|
|
18
|
+
export declare function server_get_versions_software_by_system(system: string): Promise<import("../types").IWebResponseCompatible<{
|
|
19
|
+
broken: boolean;
|
|
20
|
+
commit_hash: string | null;
|
|
21
|
+
created_at: string;
|
|
22
|
+
description: string;
|
|
23
|
+
hyperlink: string | null;
|
|
24
|
+
id: number;
|
|
25
|
+
min: boolean;
|
|
26
|
+
path_build_artifact: string | null;
|
|
27
|
+
pre: boolean;
|
|
28
|
+
stable: boolean;
|
|
29
|
+
system: string;
|
|
30
|
+
title: string | null;
|
|
31
|
+
updated_at: string | null;
|
|
32
|
+
version: string;
|
|
33
|
+
}[]>>;
|
|
34
|
+
export declare function server_get_versions_software_with_build_urls(): Promise<import("../types").IWebResponseCompatible<import("../types").IVersionsSoftwareWithBuildUrl[]>>;
|
|
35
|
+
export declare function server_get_versions_software_by_system_with_build_urls(system: string): Promise<import("../types").IWebResponseCompatible<import("../types").IVersionsSoftwareWithBuildUrl[]>>;
|
|
36
|
+
export declare function server_create_version_software(newVersionSoftware: VersionsSoftwareInsert): Promise<import("../types").IWebResponseCompatible<{
|
|
37
|
+
broken: boolean;
|
|
38
|
+
commit_hash: string | null;
|
|
39
|
+
created_at: string;
|
|
40
|
+
description: string;
|
|
41
|
+
hyperlink: string | null;
|
|
42
|
+
id: number;
|
|
43
|
+
min: boolean;
|
|
44
|
+
path_build_artifact: string | null;
|
|
45
|
+
pre: boolean;
|
|
46
|
+
stable: boolean;
|
|
47
|
+
system: string;
|
|
48
|
+
title: string | null;
|
|
49
|
+
updated_at: string | null;
|
|
50
|
+
version: string;
|
|
51
|
+
} | null>>;
|
|
52
|
+
export declare function server_update_version_software(version_id: number, updatedVersionSoftware: Partial<VersionsSoftwareInsert>): Promise<import("../types").IWebResponseCompatible<{
|
|
53
|
+
broken: boolean;
|
|
54
|
+
commit_hash: string | null;
|
|
55
|
+
created_at: string;
|
|
56
|
+
description: string;
|
|
57
|
+
hyperlink: string | null;
|
|
58
|
+
id: number;
|
|
59
|
+
min: boolean;
|
|
60
|
+
path_build_artifact: string | null;
|
|
61
|
+
pre: boolean;
|
|
62
|
+
stable: boolean;
|
|
63
|
+
system: string;
|
|
64
|
+
title: string | null;
|
|
65
|
+
updated_at: string | null;
|
|
66
|
+
version: string;
|
|
67
|
+
} | null>>;
|
|
68
|
+
export declare function server_delete_version_software(version_id: number): Promise<import("../types").IWebResponseCompatible<{
|
|
69
|
+
broken: boolean;
|
|
70
|
+
commit_hash: string | null;
|
|
71
|
+
created_at: string;
|
|
72
|
+
description: string;
|
|
73
|
+
hyperlink: string | null;
|
|
74
|
+
id: number;
|
|
75
|
+
min: boolean;
|
|
76
|
+
path_build_artifact: string | null;
|
|
77
|
+
pre: boolean;
|
|
78
|
+
stable: boolean;
|
|
79
|
+
system: string;
|
|
80
|
+
title: string | null;
|
|
81
|
+
updated_at: string | null;
|
|
82
|
+
version: string;
|
|
83
|
+
} | null>>;
|
|
@@ -1,57 +1,30 @@
|
|
|
1
|
-
"use server";
|
|
2
1
|
import { newServerClient } from "../supabase/server";
|
|
3
|
-
import {
|
|
4
|
-
import { generateSignedUrlsBatchWithClient } from "./storage_internal";
|
|
5
|
-
async function attachBuildArtifactUrls(client, data) {
|
|
6
|
-
const uniquePaths = Array.from(new Set(data
|
|
7
|
-
.map((version) => version.path_build_artifact)
|
|
8
|
-
.filter((path) => !!path)));
|
|
9
|
-
if (uniquePaths.length === 0) {
|
|
10
|
-
return data.map((version) => ({
|
|
11
|
-
...version,
|
|
12
|
-
build_artifact_url: null,
|
|
13
|
-
}));
|
|
14
|
-
}
|
|
15
|
-
const signedUrls = await generateSignedUrlsBatchWithClient(client, uniquePaths);
|
|
16
|
-
const urlMap = new Map();
|
|
17
|
-
uniquePaths.forEach((path, index) => {
|
|
18
|
-
urlMap.set(path, signedUrls[index]);
|
|
19
|
-
});
|
|
20
|
-
return data.map((version) => ({
|
|
21
|
-
...version,
|
|
22
|
-
build_artifact_url: version.path_build_artifact
|
|
23
|
-
? urlMap.get(version.path_build_artifact) ?? null
|
|
24
|
-
: null,
|
|
25
|
-
}));
|
|
26
|
-
}
|
|
2
|
+
import { create_version_software, delete_version_software, get_versions_software, get_versions_software_by_system, get_versions_software_by_system_with_build_urls, get_versions_software_with_build_urls, update_version_software, } from "./versions_software";
|
|
27
3
|
export async function server_get_versions_software() {
|
|
28
4
|
const client = await newServerClient();
|
|
29
|
-
|
|
30
|
-
.from("versions_software")
|
|
31
|
-
.select("*")
|
|
32
|
-
.order("created_at", { ascending: false });
|
|
33
|
-
if (error) {
|
|
34
|
-
return IWebResponse.error(error.message).to_compatible();
|
|
35
|
-
}
|
|
36
|
-
if (!data) {
|
|
37
|
-
return IWebResponse.error("No software versions found").to_compatible();
|
|
38
|
-
}
|
|
39
|
-
const withUrls = await attachBuildArtifactUrls(client, data);
|
|
40
|
-
return IWebResponse.success(withUrls).to_compatible();
|
|
5
|
+
return get_versions_software(client);
|
|
41
6
|
}
|
|
42
7
|
export async function server_get_versions_software_by_system(system) {
|
|
43
8
|
const client = await newServerClient();
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
const
|
|
56
|
-
return
|
|
9
|
+
return get_versions_software_by_system(client, system);
|
|
10
|
+
}
|
|
11
|
+
export async function server_get_versions_software_with_build_urls() {
|
|
12
|
+
const client = await newServerClient();
|
|
13
|
+
return get_versions_software_with_build_urls(client);
|
|
14
|
+
}
|
|
15
|
+
export async function server_get_versions_software_by_system_with_build_urls(system) {
|
|
16
|
+
const client = await newServerClient();
|
|
17
|
+
return get_versions_software_by_system_with_build_urls(client, system);
|
|
18
|
+
}
|
|
19
|
+
export async function server_create_version_software(newVersionSoftware) {
|
|
20
|
+
const client = await newServerClient();
|
|
21
|
+
return create_version_software(client, newVersionSoftware);
|
|
22
|
+
}
|
|
23
|
+
export async function server_update_version_software(version_id, updatedVersionSoftware) {
|
|
24
|
+
const client = await newServerClient();
|
|
25
|
+
return update_version_software(client, version_id, updatedVersionSoftware);
|
|
26
|
+
}
|
|
27
|
+
export async function server_delete_version_software(version_id) {
|
|
28
|
+
const client = await newServerClient();
|
|
29
|
+
return delete_version_software(client, version_id);
|
|
57
30
|
}
|
package/dist/helpers/zones.d.ts
CHANGED
|
@@ -1,19 +1,4 @@
|
|
|
1
1
|
import { IZoneWithActions } from "../types/db";
|
|
2
2
|
import { IWebResponseCompatible } from "../types/requests";
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Get more zones and actions for a herd
|
|
6
|
-
* @param herd_id - The ID of the herd to get zones and actions for
|
|
7
|
-
* @param offset - The offset to start the query from
|
|
8
|
-
* @param page_count - The number of zones and actions to return
|
|
9
|
-
* @returns A list of zones and actions
|
|
10
|
-
* @throws An error if the zones or actions are not fetched
|
|
11
|
-
*/
|
|
12
|
-
export declare function server_get_more_zones_and_actions_for_herd(herd_id: number, offset: number, page_count?: number, client?: SupabaseClient): Promise<IWebResponseCompatible<IZoneWithActions[]>>;
|
|
13
|
-
/**
|
|
14
|
-
* Create zones and actions for a herd
|
|
15
|
-
* @param zones - The zones to create
|
|
16
|
-
* @returns A list of zones and actions
|
|
17
|
-
* @throws An error if the zones or actions are not created
|
|
18
|
-
*/
|
|
3
|
+
export declare function server_get_more_zones_and_actions_for_herd(herd_id: number, offset: number, page_count?: number): Promise<IWebResponseCompatible<IZoneWithActions[]>>;
|
|
19
4
|
export declare function server_create_zones_with_actions(zones: IZoneWithActions[]): Promise<IWebResponseCompatible<IZoneWithActions[]>>;
|
package/dist/helpers/zones.js
CHANGED
|
@@ -1,108 +1,8 @@
|
|
|
1
1
|
import { newServerClient } from "../supabase/server";
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
* @param herd_id - The ID of the herd to get zones and actions for
|
|
6
|
-
* @param offset - The offset to start the query from
|
|
7
|
-
* @param page_count - The number of zones and actions to return
|
|
8
|
-
* @returns A list of zones and actions
|
|
9
|
-
* @throws An error if the zones or actions are not fetched
|
|
10
|
-
*/
|
|
11
|
-
export async function server_get_more_zones_and_actions_for_herd(herd_id, offset, page_count = 10, client) {
|
|
12
|
-
const from = offset * page_count;
|
|
13
|
-
const to = from + page_count - 1;
|
|
14
|
-
const supabase = client || (await newServerClient());
|
|
15
|
-
// make rpc call to get_events_with_tags_for_herd(herd_id, offset, limit)
|
|
16
|
-
const { data, error } = await supabase.rpc("get_zones_and_actions_for_herd", {
|
|
17
|
-
herd_id_caller: herd_id,
|
|
18
|
-
offset_caller: from,
|
|
19
|
-
limit_caller: page_count,
|
|
20
|
-
});
|
|
21
|
-
if (error) {
|
|
22
|
-
console.warn("Error fetching zones and actions for herd:", error.message);
|
|
23
|
-
return {
|
|
24
|
-
status: EnumWebResponse.ERROR,
|
|
25
|
-
msg: error.message,
|
|
26
|
-
data: [],
|
|
27
|
-
};
|
|
28
|
-
}
|
|
29
|
-
return IWebResponse.success(data.map((zone) => ({
|
|
30
|
-
...zone,
|
|
31
|
-
actions: zone.actions ?? [],
|
|
32
|
-
}))).to_compatible();
|
|
2
|
+
import { create_zones_with_actions_query, get_more_zones_and_actions_for_herd_query, } from "./zones.queries";
|
|
3
|
+
export async function server_get_more_zones_and_actions_for_herd(herd_id, offset, page_count = 10) {
|
|
4
|
+
return get_more_zones_and_actions_for_herd_query(await newServerClient(), herd_id, offset, page_count);
|
|
33
5
|
}
|
|
34
|
-
/**
|
|
35
|
-
* Create zones and actions for a herd
|
|
36
|
-
* @param zones - The zones to create
|
|
37
|
-
* @returns A list of zones and actions
|
|
38
|
-
* @throws An error if the zones or actions are not created
|
|
39
|
-
*/
|
|
40
6
|
export async function server_create_zones_with_actions(zones) {
|
|
41
|
-
|
|
42
|
-
let actions = zones.flatMap((zone) => zone.actions);
|
|
43
|
-
let formatted_zones = zones.map((zone) => {
|
|
44
|
-
let formatted_zone = { ...zone };
|
|
45
|
-
delete formatted_zone.id;
|
|
46
|
-
delete formatted_zone.inserted_at;
|
|
47
|
-
delete formatted_zone.actions;
|
|
48
|
-
return formatted_zone;
|
|
49
|
-
});
|
|
50
|
-
let formatted_actions = actions.map((action) => {
|
|
51
|
-
let formatted_action = { ...action };
|
|
52
|
-
delete formatted_action.id;
|
|
53
|
-
delete formatted_action.zone_id;
|
|
54
|
-
delete formatted_action.inserted_at;
|
|
55
|
-
return formatted_action;
|
|
56
|
-
});
|
|
57
|
-
const supabase = await newServerClient();
|
|
58
|
-
// insert data and return the response
|
|
59
|
-
const { data, error } = await supabase
|
|
60
|
-
.from("zones")
|
|
61
|
-
.insert(formatted_zones)
|
|
62
|
-
.select("*");
|
|
63
|
-
if (error) {
|
|
64
|
-
let msg = `Error creating zones: ${error.message}`;
|
|
65
|
-
return {
|
|
66
|
-
status: EnumWebResponse.ERROR,
|
|
67
|
-
msg: msg,
|
|
68
|
-
data: null,
|
|
69
|
-
};
|
|
70
|
-
}
|
|
71
|
-
// get zone id
|
|
72
|
-
let zone_ids = data.map((zone) => {
|
|
73
|
-
return zone.id;
|
|
74
|
-
});
|
|
75
|
-
// if zone ids length is zero, return error
|
|
76
|
-
if (zone_ids.length === 0) {
|
|
77
|
-
return {
|
|
78
|
-
status: EnumWebResponse.ERROR,
|
|
79
|
-
msg: "No zones created",
|
|
80
|
-
data: null,
|
|
81
|
-
};
|
|
82
|
-
}
|
|
83
|
-
// add zone id to formatted actions
|
|
84
|
-
formatted_actions.forEach((action) => {
|
|
85
|
-
action.zone_id = zone_ids[0];
|
|
86
|
-
});
|
|
87
|
-
// insert actions
|
|
88
|
-
const { data: data_actions, error: error_actions } = await supabase
|
|
89
|
-
.from("actions")
|
|
90
|
-
.insert(formatted_actions)
|
|
91
|
-
.select("*");
|
|
92
|
-
if (error_actions) {
|
|
93
|
-
let msg = `Error creating actions: ${error_actions.message}`;
|
|
94
|
-
return {
|
|
95
|
-
status: EnumWebResponse.ERROR,
|
|
96
|
-
msg: msg,
|
|
97
|
-
data: null,
|
|
98
|
-
};
|
|
99
|
-
}
|
|
100
|
-
// merge data and data_actions
|
|
101
|
-
const merged_data = data.map((zone) => {
|
|
102
|
-
return {
|
|
103
|
-
...zone,
|
|
104
|
-
actions: data_actions.filter((action) => action.zone_id === zone.id),
|
|
105
|
-
};
|
|
106
|
-
});
|
|
107
|
-
return IWebResponse.success(merged_data).to_compatible();
|
|
7
|
+
return create_zones_with_actions_query(await newServerClient(), zones);
|
|
108
8
|
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { SupabaseClient } from "@supabase/supabase-js";
|
|
2
|
+
import { IZoneWithActions } from "../types/db";
|
|
3
|
+
import { IWebResponseCompatible } from "../types/requests";
|
|
4
|
+
import { Database } from "../types/supabase";
|
|
5
|
+
export declare function get_more_zones_and_actions_for_herd_query(client: SupabaseClient<Database>, herd_id: number, offset: number, page_count?: number): Promise<IWebResponseCompatible<IZoneWithActions[]>>;
|
|
6
|
+
export declare function create_zones_with_actions_query(client: SupabaseClient<Database>, zones: IZoneWithActions[]): Promise<IWebResponseCompatible<IZoneWithActions[]>>;
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { EnumWebResponse, IWebResponse, } from "../types/requests";
|
|
2
|
+
export async function get_more_zones_and_actions_for_herd_query(client, herd_id, offset, page_count = 10) {
|
|
3
|
+
const from = offset * page_count;
|
|
4
|
+
const { data, error } = await client.rpc("get_zones_and_actions_for_herd", {
|
|
5
|
+
herd_id_caller: herd_id,
|
|
6
|
+
offset_caller: from,
|
|
7
|
+
limit_caller: page_count,
|
|
8
|
+
});
|
|
9
|
+
if (error) {
|
|
10
|
+
console.warn("Error fetching zones and actions for herd:", error.message);
|
|
11
|
+
return {
|
|
12
|
+
status: EnumWebResponse.ERROR,
|
|
13
|
+
msg: error.message,
|
|
14
|
+
data: [],
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
return IWebResponse.success((data ?? []).map((zone) => ({
|
|
18
|
+
...zone,
|
|
19
|
+
actions: zone.actions ?? [],
|
|
20
|
+
}))).to_compatible();
|
|
21
|
+
}
|
|
22
|
+
export async function create_zones_with_actions_query(client, zones) {
|
|
23
|
+
const actions = zones.flatMap((zone) => zone.actions);
|
|
24
|
+
const formatted_zones = zones.map((zone) => {
|
|
25
|
+
const formatted_zone = { ...zone };
|
|
26
|
+
delete formatted_zone.id;
|
|
27
|
+
delete formatted_zone.inserted_at;
|
|
28
|
+
delete formatted_zone.actions;
|
|
29
|
+
return formatted_zone;
|
|
30
|
+
});
|
|
31
|
+
const formatted_actions = actions.map((action) => {
|
|
32
|
+
const formatted_action = { ...action };
|
|
33
|
+
delete formatted_action.id;
|
|
34
|
+
delete formatted_action.zone_id;
|
|
35
|
+
delete formatted_action.inserted_at;
|
|
36
|
+
return formatted_action;
|
|
37
|
+
});
|
|
38
|
+
const { data, error } = await client
|
|
39
|
+
.from("zones")
|
|
40
|
+
.insert(formatted_zones)
|
|
41
|
+
.select("*");
|
|
42
|
+
if (error) {
|
|
43
|
+
const msg = `Error creating zones: ${error.message}`;
|
|
44
|
+
return {
|
|
45
|
+
status: EnumWebResponse.ERROR,
|
|
46
|
+
msg,
|
|
47
|
+
data: null,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
const zone_ids = data.map((zone) => zone.id);
|
|
51
|
+
if (zone_ids.length === 0) {
|
|
52
|
+
return {
|
|
53
|
+
status: EnumWebResponse.ERROR,
|
|
54
|
+
msg: "No zones created",
|
|
55
|
+
data: null,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
formatted_actions.forEach((action) => {
|
|
59
|
+
action.zone_id = zone_ids[0];
|
|
60
|
+
});
|
|
61
|
+
const { data: data_actions, error: error_actions } = await client
|
|
62
|
+
.from("actions")
|
|
63
|
+
.insert(formatted_actions)
|
|
64
|
+
.select("*");
|
|
65
|
+
if (error_actions) {
|
|
66
|
+
const msg = `Error creating actions: ${error_actions.message}`;
|
|
67
|
+
return {
|
|
68
|
+
status: EnumWebResponse.ERROR,
|
|
69
|
+
msg,
|
|
70
|
+
data: null,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
const merged_data = data.map((zone) => ({
|
|
74
|
+
...zone,
|
|
75
|
+
actions: data_actions.filter((action) => action.zone_id === zone.id),
|
|
76
|
+
}));
|
|
77
|
+
return IWebResponse.success(merged_data).to_compatible();
|
|
78
|
+
}
|
|
@@ -1,14 +1,20 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { useMemo } from "react";
|
|
2
|
+
import { useMemo, useRef } from "react";
|
|
3
3
|
import { filter_realtime_topics } from "../helpers/realtime_topic_access";
|
|
4
4
|
import { useOptionalClientAbilitiesMint } from "../providers/ScoutRefreshProvider";
|
|
5
5
|
export function useAuthorizedRealtimeTopics(topics) {
|
|
6
6
|
const abilities = useOptionalClientAbilitiesMint();
|
|
7
7
|
const topicsKey = topics.join("|");
|
|
8
|
-
|
|
8
|
+
const filteredTopics = useMemo(() => {
|
|
9
9
|
const requested = topicsKey.split("|").filter(Boolean);
|
|
10
10
|
if (!abilities)
|
|
11
11
|
return requested;
|
|
12
12
|
return filter_realtime_topics(abilities.status, abilities.mint, requested);
|
|
13
13
|
}, [abilities, topicsKey]);
|
|
14
|
+
const filteredKey = filteredTopics.join("|");
|
|
15
|
+
const stableTopicsRef = useRef({ key: filteredKey, topics: filteredTopics });
|
|
16
|
+
if (stableTopicsRef.current.key !== filteredKey) {
|
|
17
|
+
stableTopicsRef.current = { key: filteredKey, topics: filteredTopics };
|
|
18
|
+
}
|
|
19
|
+
return stableTopicsRef.current.topics;
|
|
14
20
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
"use client";
|
|
1
2
|
import { useState, useCallback, useMemo, useEffect, useRef } from "react";
|
|
2
3
|
import { useGetSessionsInfiniteByHerdQuery, useGetSessionsInfiniteByDeviceQuery, useGetEventsInfiniteByHerdQuery, useGetEventsInfiniteByDeviceQuery, useGetArtifactsInfiniteByHerdQuery, useGetArtifactsInfiniteByDeviceQuery, useGetFeedInfiniteByHerdQuery, useGetFeedInfiniteByDeviceQuery, useGetAnalysisJobsInfiniteQuery, useGetAnalysisTasksInfiniteQuery, } from "../store/api";
|
|
3
4
|
function useInfiniteFiltersKey(options) {
|
|
@@ -773,10 +774,13 @@ export const useInfiniteFeedByDevice = (deviceId, options) => {
|
|
|
773
774
|
}
|
|
774
775
|
return prev;
|
|
775
776
|
});
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
777
|
+
}, [
|
|
778
|
+
currentQuery.data,
|
|
779
|
+
currentQuery.isLoading,
|
|
780
|
+
cursorForQuery,
|
|
781
|
+
pages.length,
|
|
782
|
+
options.limit,
|
|
783
|
+
]);
|
|
780
784
|
const loadMore = useCallback(() => {
|
|
781
785
|
if (lastResult?.hasMore &&
|
|
782
786
|
lastResult.nextCursor != null &&
|
|
@@ -952,26 +956,26 @@ export const useInfiniteAnalysisTasks = (options) => {
|
|
|
952
956
|
error: currentQuery.error,
|
|
953
957
|
};
|
|
954
958
|
};
|
|
955
|
-
// =====================================================
|
|
956
|
-
// INTERSECTION OBSERVER HOOK FOR AUTO-LOADING
|
|
957
|
-
// =====================================================
|
|
958
959
|
export const useIntersectionObserver = (callback, options = {}) => {
|
|
959
960
|
const [element, setElement] = useState(null);
|
|
961
|
+
const root = options.root ?? null;
|
|
962
|
+
const rootMargin = options.rootMargin ?? "0px";
|
|
963
|
+
const thresholdKey = (Array.isArray(options.threshold)
|
|
964
|
+
? options.threshold
|
|
965
|
+
: [options.threshold ?? 0.1]).join(",");
|
|
960
966
|
useEffect(() => {
|
|
961
967
|
if (!element)
|
|
962
968
|
return;
|
|
969
|
+
const thresholds = thresholdKey.split(",").map(Number);
|
|
970
|
+
const threshold = thresholds.length === 1 ? thresholds[0] : thresholds;
|
|
963
971
|
const observer = new IntersectionObserver((entries) => {
|
|
964
972
|
const first = entries[0];
|
|
965
973
|
if (first.isIntersecting) {
|
|
966
974
|
callback();
|
|
967
975
|
}
|
|
968
|
-
}, {
|
|
976
|
+
}, { root, rootMargin, threshold });
|
|
969
977
|
observer.observe(element);
|
|
970
|
-
return () =>
|
|
971
|
-
|
|
972
|
-
observer.unobserve(element);
|
|
973
|
-
}
|
|
974
|
-
};
|
|
975
|
-
}, [element, callback, options]);
|
|
978
|
+
return () => observer.disconnect();
|
|
979
|
+
}, [element, callback, root, rootMargin, thresholdKey]);
|
|
976
980
|
return setElement;
|
|
977
981
|
};
|