@axcode/axcloud-sdk 0.1.6 → 0.1.7-dev.3a3be6d
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 +39 -3
- package/dist/index.d.mts +411 -1
- package/dist/index.d.ts +411 -1
- package/dist/index.js +337 -3
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +324 -5
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { createContext, useContext, useMemo, useCallback, useRef } from 'react';
|
|
1
|
+
import { createContext, useContext, useMemo, useCallback, useState, useRef } from 'react';
|
|
2
2
|
import { Auth0Provider, useAuth0 } from '@auth0/auth0-react';
|
|
3
3
|
import { QueryClient, QueryClientProvider, useQuery, useQueryClient, useMutation } from '@tanstack/react-query';
|
|
4
4
|
import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
|
|
@@ -122,7 +122,7 @@ var AxCloudClient = class {
|
|
|
122
122
|
*/
|
|
123
123
|
shouldAttachApiKey(path) {
|
|
124
124
|
const normalized = path.startsWith("/") ? path : `/${path}`;
|
|
125
|
-
return normalized.startsWith("/public/") || normalized.startsWith("/api/public/") || normalized.startsWith("/content/public/");
|
|
125
|
+
return normalized.startsWith("/public/") || normalized.startsWith("/api/public/") || normalized.startsWith("/content/public/") || normalized.startsWith("/media/public/") || normalized.startsWith("/documents/public/") || normalized.startsWith("/barnsport/public/") || normalized.startsWith("/api/barnsport/public/");
|
|
126
126
|
}
|
|
127
127
|
/**
|
|
128
128
|
* Make an authenticated request
|
|
@@ -431,6 +431,98 @@ function createFormHelper(config) {
|
|
|
431
431
|
})
|
|
432
432
|
};
|
|
433
433
|
}
|
|
434
|
+
|
|
435
|
+
// src/core/voting.ts
|
|
436
|
+
function baseOf(votingApiUrl) {
|
|
437
|
+
return votingApiUrl.replace(/\/$/, "");
|
|
438
|
+
}
|
|
439
|
+
async function readJson(response) {
|
|
440
|
+
const json = await response.json().catch(() => ({}));
|
|
441
|
+
if (json && typeof json === "object" && "success" in json && "data" in json) {
|
|
442
|
+
return json.data;
|
|
443
|
+
}
|
|
444
|
+
return json;
|
|
445
|
+
}
|
|
446
|
+
async function ensureOk(response) {
|
|
447
|
+
if (!response.ok) {
|
|
448
|
+
const body = await response.json().catch(() => ({}));
|
|
449
|
+
const message = body && (body.error || body.message) || `Request failed with status ${response.status}`;
|
|
450
|
+
throw new Error(message);
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
async function checkVotingCode(votingApiUrl, params) {
|
|
454
|
+
const response = await fetch(
|
|
455
|
+
`${baseOf(votingApiUrl)}/public/organizations/${params.orgId}/polls/${params.pollId}/eligibility`,
|
|
456
|
+
{
|
|
457
|
+
method: "POST",
|
|
458
|
+
headers: { "Content-Type": "application/json" },
|
|
459
|
+
body: JSON.stringify({ code: params.code })
|
|
460
|
+
}
|
|
461
|
+
);
|
|
462
|
+
await ensureOk(response);
|
|
463
|
+
return readJson(response);
|
|
464
|
+
}
|
|
465
|
+
async function castVoteWithCode(votingApiUrl, params) {
|
|
466
|
+
const response = await fetch(
|
|
467
|
+
`${baseOf(votingApiUrl)}/public/organizations/${params.orgId}/polls/${params.pollId}/vote`,
|
|
468
|
+
{
|
|
469
|
+
method: "POST",
|
|
470
|
+
headers: { "Content-Type": "application/json" },
|
|
471
|
+
body: JSON.stringify({ code: params.code, selected_options: params.selectedOptions, rankings: params.rankings })
|
|
472
|
+
}
|
|
473
|
+
);
|
|
474
|
+
await ensureOk(response);
|
|
475
|
+
return readJson(response);
|
|
476
|
+
}
|
|
477
|
+
async function getVotingReceipt(votingApiUrl, params) {
|
|
478
|
+
const response = await fetch(
|
|
479
|
+
`${baseOf(votingApiUrl)}/public/organizations/${params.orgId}/polls/${params.pollId}/receipt`,
|
|
480
|
+
{
|
|
481
|
+
method: "POST",
|
|
482
|
+
headers: { "Content-Type": "application/json" },
|
|
483
|
+
body: JSON.stringify({ code: params.code })
|
|
484
|
+
}
|
|
485
|
+
);
|
|
486
|
+
await ensureOk(response);
|
|
487
|
+
return readJson(response);
|
|
488
|
+
}
|
|
489
|
+
function authHeaders(accessToken) {
|
|
490
|
+
return { "Content-Type": "application/json", Authorization: `Bearer ${accessToken}` };
|
|
491
|
+
}
|
|
492
|
+
async function getBallot(votingApiUrl, params) {
|
|
493
|
+
const base = `${baseOf(votingApiUrl)}/organizations/${params.orgId}/polls/${params.pollId}`;
|
|
494
|
+
const pollResp = await fetch(base, { headers: authHeaders(params.accessToken) });
|
|
495
|
+
await ensureOk(pollResp);
|
|
496
|
+
const poll = await readJson(pollResp);
|
|
497
|
+
let candidates = [];
|
|
498
|
+
if (poll.poll_type === "election") {
|
|
499
|
+
const candResp = await fetch(`${base}/candidates`, { headers: authHeaders(params.accessToken) });
|
|
500
|
+
await ensureOk(candResp);
|
|
501
|
+
const data = await readJson(candResp);
|
|
502
|
+
candidates = data.candidates || [];
|
|
503
|
+
}
|
|
504
|
+
return { ...poll, candidates };
|
|
505
|
+
}
|
|
506
|
+
async function checkEligibility(votingApiUrl, params) {
|
|
507
|
+
const response = await fetch(
|
|
508
|
+
`${baseOf(votingApiUrl)}/organizations/${params.orgId}/polls/${params.pollId}/eligibility`,
|
|
509
|
+
{ headers: authHeaders(params.accessToken) }
|
|
510
|
+
);
|
|
511
|
+
await ensureOk(response);
|
|
512
|
+
return readJson(response);
|
|
513
|
+
}
|
|
514
|
+
async function castVote(votingApiUrl, params) {
|
|
515
|
+
const response = await fetch(
|
|
516
|
+
`${baseOf(votingApiUrl)}/organizations/${params.orgId}/polls/${params.pollId}/vote`,
|
|
517
|
+
{
|
|
518
|
+
method: "POST",
|
|
519
|
+
headers: authHeaders(params.accessToken),
|
|
520
|
+
body: JSON.stringify({ selected_options: params.selectedOptions, rankings: params.rankings })
|
|
521
|
+
}
|
|
522
|
+
);
|
|
523
|
+
await ensureOk(response);
|
|
524
|
+
return readJson(response);
|
|
525
|
+
}
|
|
434
526
|
var AxCloudContext = createContext(null);
|
|
435
527
|
function useAxCloudContext() {
|
|
436
528
|
const context = useContext(AxCloudContext);
|
|
@@ -741,6 +833,7 @@ function useNews(options = {}) {
|
|
|
741
833
|
search,
|
|
742
834
|
sortBy = "publishedAt",
|
|
743
835
|
sortOrder = "desc",
|
|
836
|
+
lang,
|
|
744
837
|
publicOnly = false
|
|
745
838
|
} = options;
|
|
746
839
|
const usePublicEndpoint = isPublicMode || publicOnly;
|
|
@@ -757,7 +850,8 @@ function useNews(options = {}) {
|
|
|
757
850
|
sectionId,
|
|
758
851
|
search,
|
|
759
852
|
sortBy,
|
|
760
|
-
sortOrder
|
|
853
|
+
sortOrder,
|
|
854
|
+
lang
|
|
761
855
|
],
|
|
762
856
|
queryFn: async () => {
|
|
763
857
|
const endpoint = usePublicEndpoint ? `/content/public/${orgId}/news` : `/content/members/${orgId}/news`;
|
|
@@ -769,7 +863,8 @@ function useNews(options = {}) {
|
|
|
769
863
|
sectionId,
|
|
770
864
|
search,
|
|
771
865
|
sortBy,
|
|
772
|
-
sortOrder
|
|
866
|
+
sortOrder,
|
|
867
|
+
lang
|
|
773
868
|
});
|
|
774
869
|
},
|
|
775
870
|
staleTime: 1e3 * 60 * 5
|
|
@@ -998,6 +1093,76 @@ function useUpdateFormSubmission() {
|
|
|
998
1093
|
}
|
|
999
1094
|
});
|
|
1000
1095
|
}
|
|
1096
|
+
function useCodeBallot({ pollId, votingApiUrl }) {
|
|
1097
|
+
const { orgId, config } = useAxCloudContext();
|
|
1098
|
+
const baseUrl = votingApiUrl || `${config.apiUrl.replace(/\/$/, "")}/voting`;
|
|
1099
|
+
const [stage, setStage] = useState("enter_code");
|
|
1100
|
+
const [code, setCode] = useState("");
|
|
1101
|
+
const [ballot, setBallot] = useState(null);
|
|
1102
|
+
const [receipt, setReceipt] = useState(null);
|
|
1103
|
+
const [reason, setReason] = useState(void 0);
|
|
1104
|
+
const [loading, setLoading] = useState(false);
|
|
1105
|
+
const [error, setError] = useState(null);
|
|
1106
|
+
const validateCode = useCallback(
|
|
1107
|
+
async (inputCode) => {
|
|
1108
|
+
setLoading(true);
|
|
1109
|
+
setError(null);
|
|
1110
|
+
try {
|
|
1111
|
+
const result = await checkVotingCode(baseUrl, { orgId, pollId, code: inputCode });
|
|
1112
|
+
setCode(inputCode);
|
|
1113
|
+
setReason(result.reason);
|
|
1114
|
+
if (result.has_voted) {
|
|
1115
|
+
const r = await getVotingReceipt(baseUrl, { orgId, pollId, code: inputCode }).catch(() => null);
|
|
1116
|
+
setReceipt(r);
|
|
1117
|
+
setStage("already_voted");
|
|
1118
|
+
} else if (result.eligible && result.ballot) {
|
|
1119
|
+
setBallot(result.ballot);
|
|
1120
|
+
setStage("ballot");
|
|
1121
|
+
} else {
|
|
1122
|
+
setError(result.reason || "This code cannot be used to vote right now.");
|
|
1123
|
+
}
|
|
1124
|
+
return result;
|
|
1125
|
+
} catch (e) {
|
|
1126
|
+
setError(e instanceof Error ? e.message : "Failed to validate code");
|
|
1127
|
+
return null;
|
|
1128
|
+
} finally {
|
|
1129
|
+
setLoading(false);
|
|
1130
|
+
}
|
|
1131
|
+
},
|
|
1132
|
+
[baseUrl, orgId, pollId]
|
|
1133
|
+
);
|
|
1134
|
+
const submitVote = useCallback(
|
|
1135
|
+
async (selectedOptions, rankings) => {
|
|
1136
|
+
setLoading(true);
|
|
1137
|
+
setError(null);
|
|
1138
|
+
try {
|
|
1139
|
+
await castVoteWithCode(baseUrl, { orgId, pollId, code, selectedOptions, rankings });
|
|
1140
|
+
const r = await getVotingReceipt(baseUrl, { orgId, pollId, code }).catch(() => null);
|
|
1141
|
+
setReceipt(r);
|
|
1142
|
+
setStage("submitted");
|
|
1143
|
+
return true;
|
|
1144
|
+
} catch (e) {
|
|
1145
|
+
setError(e instanceof Error ? e.message : "Failed to submit vote");
|
|
1146
|
+
return false;
|
|
1147
|
+
} finally {
|
|
1148
|
+
setLoading(false);
|
|
1149
|
+
}
|
|
1150
|
+
},
|
|
1151
|
+
[baseUrl, orgId, pollId, code]
|
|
1152
|
+
);
|
|
1153
|
+
const reset = useCallback(() => {
|
|
1154
|
+
setStage("enter_code");
|
|
1155
|
+
setCode("");
|
|
1156
|
+
setBallot(null);
|
|
1157
|
+
setReceipt(null);
|
|
1158
|
+
setReason(void 0);
|
|
1159
|
+
setError(null);
|
|
1160
|
+
}, []);
|
|
1161
|
+
return useMemo(
|
|
1162
|
+
() => ({ stage, code, ballot, receipt, reason, loading, error, validateCode, submitVote, reset }),
|
|
1163
|
+
[stage, code, ballot, receipt, reason, loading, error, validateCode, submitVote, reset]
|
|
1164
|
+
);
|
|
1165
|
+
}
|
|
1001
1166
|
var LINKED_ACCOUNTS_QUERY_KEY = ["axcloud", "linked-accounts"];
|
|
1002
1167
|
function useLinkedAccounts() {
|
|
1003
1168
|
const { client, stage } = useAxCloudContext();
|
|
@@ -1156,6 +1321,160 @@ function useMedia(mediaId) {
|
|
|
1156
1321
|
refetch: query.refetch
|
|
1157
1322
|
};
|
|
1158
1323
|
}
|
|
1324
|
+
function buildDocumentParams(options) {
|
|
1325
|
+
return {
|
|
1326
|
+
search: options?.search,
|
|
1327
|
+
tags: options?.tags?.join(","),
|
|
1328
|
+
limit: options?.limit
|
|
1329
|
+
};
|
|
1330
|
+
}
|
|
1331
|
+
function useDocuments(options) {
|
|
1332
|
+
const { client, orgId } = useAxCloudContext();
|
|
1333
|
+
const params = buildDocumentParams(options);
|
|
1334
|
+
const query = useQuery({
|
|
1335
|
+
queryKey: ["axcloud", "documents", "list", orgId, options],
|
|
1336
|
+
queryFn: async () => {
|
|
1337
|
+
return client.get(`/documents/public/${orgId}/documents`, params);
|
|
1338
|
+
},
|
|
1339
|
+
staleTime: 1e3 * 60 * 5
|
|
1340
|
+
});
|
|
1341
|
+
return {
|
|
1342
|
+
documents: query.data?.items ?? [],
|
|
1343
|
+
items: query.data?.items ?? [],
|
|
1344
|
+
count: query.data?.count ?? 0,
|
|
1345
|
+
isLoading: query.isLoading,
|
|
1346
|
+
isError: query.isError,
|
|
1347
|
+
error: query.error,
|
|
1348
|
+
refetch: query.refetch
|
|
1349
|
+
};
|
|
1350
|
+
}
|
|
1351
|
+
function useDocumentDownload(documentId) {
|
|
1352
|
+
const { client, orgId } = useAxCloudContext();
|
|
1353
|
+
const query = useQuery({
|
|
1354
|
+
queryKey: ["axcloud", "documents", "download", orgId, documentId],
|
|
1355
|
+
queryFn: async () => {
|
|
1356
|
+
return client.get(
|
|
1357
|
+
`/documents/public/${orgId}/documents/${encodeURIComponent(documentId || "")}/download`
|
|
1358
|
+
);
|
|
1359
|
+
},
|
|
1360
|
+
enabled: !!documentId,
|
|
1361
|
+
staleTime: 1e3 * 60 * 10,
|
|
1362
|
+
gcTime: 1e3 * 60 * 14
|
|
1363
|
+
});
|
|
1364
|
+
return {
|
|
1365
|
+
url: query.data?.url ?? null,
|
|
1366
|
+
documentUrl: query.data?.url ?? null,
|
|
1367
|
+
filename: query.data?.filename ?? null,
|
|
1368
|
+
mimeType: query.data?.mimeType ?? null,
|
|
1369
|
+
expiresIn: query.data?.expiresIn ?? null,
|
|
1370
|
+
isLoading: query.isLoading,
|
|
1371
|
+
isError: query.isError,
|
|
1372
|
+
error: query.error,
|
|
1373
|
+
refetch: query.refetch
|
|
1374
|
+
};
|
|
1375
|
+
}
|
|
1376
|
+
function useBarnsportMunicipalities() {
|
|
1377
|
+
const { client, orgId } = useAxCloudContext();
|
|
1378
|
+
const query = useQuery({
|
|
1379
|
+
queryKey: ["axcloud", "barnsport", "municipalities", orgId],
|
|
1380
|
+
queryFn: () => client.get(
|
|
1381
|
+
`/barnsport/public/${orgId}/municipalities`
|
|
1382
|
+
),
|
|
1383
|
+
staleTime: 1e3 * 60 * 30
|
|
1384
|
+
});
|
|
1385
|
+
return {
|
|
1386
|
+
municipalities: query.data?.items ?? [],
|
|
1387
|
+
count: query.data?.count ?? 0,
|
|
1388
|
+
isLoading: query.isLoading,
|
|
1389
|
+
isError: query.isError,
|
|
1390
|
+
error: query.error,
|
|
1391
|
+
refetch: query.refetch
|
|
1392
|
+
};
|
|
1393
|
+
}
|
|
1394
|
+
function useBarnsportSports() {
|
|
1395
|
+
const { client, orgId } = useAxCloudContext();
|
|
1396
|
+
const query = useQuery({
|
|
1397
|
+
queryKey: ["axcloud", "barnsport", "sports", orgId],
|
|
1398
|
+
queryFn: () => client.get(
|
|
1399
|
+
`/barnsport/public/${orgId}/sports`
|
|
1400
|
+
),
|
|
1401
|
+
staleTime: 1e3 * 60 * 30
|
|
1402
|
+
});
|
|
1403
|
+
return {
|
|
1404
|
+
sports: query.data?.items ?? [],
|
|
1405
|
+
count: query.data?.count ?? 0,
|
|
1406
|
+
isLoading: query.isLoading,
|
|
1407
|
+
isError: query.isError,
|
|
1408
|
+
error: query.error,
|
|
1409
|
+
refetch: query.refetch
|
|
1410
|
+
};
|
|
1411
|
+
}
|
|
1412
|
+
function useBarnsportActivities(filters = {}) {
|
|
1413
|
+
const { client, orgId } = useAxCloudContext();
|
|
1414
|
+
const params = { ...filters };
|
|
1415
|
+
const query = useQuery({
|
|
1416
|
+
queryKey: ["axcloud", "barnsport", "activities", orgId, filters],
|
|
1417
|
+
queryFn: () => client.get(
|
|
1418
|
+
`/barnsport/public/${orgId}/activities`,
|
|
1419
|
+
params
|
|
1420
|
+
),
|
|
1421
|
+
staleTime: 1e3 * 60 * 5
|
|
1422
|
+
});
|
|
1423
|
+
return {
|
|
1424
|
+
activities: query.data?.items ?? [],
|
|
1425
|
+
count: query.data?.count ?? 0,
|
|
1426
|
+
nextCursor: query.data?.nextCursor ?? null,
|
|
1427
|
+
isLoading: query.isLoading,
|
|
1428
|
+
isError: query.isError,
|
|
1429
|
+
error: query.error,
|
|
1430
|
+
refetch: query.refetch
|
|
1431
|
+
};
|
|
1432
|
+
}
|
|
1433
|
+
function useBarnsportActivity(slug) {
|
|
1434
|
+
const { client, orgId } = useAxCloudContext();
|
|
1435
|
+
const query = useQuery({
|
|
1436
|
+
queryKey: ["axcloud", "barnsport", "activity", orgId, slug],
|
|
1437
|
+
queryFn: () => client.get(
|
|
1438
|
+
`/barnsport/public/${orgId}/activities/${slug || ""}`
|
|
1439
|
+
),
|
|
1440
|
+
enabled: Boolean(slug),
|
|
1441
|
+
staleTime: 1e3 * 60 * 5
|
|
1442
|
+
});
|
|
1443
|
+
return {
|
|
1444
|
+
activity: query.data?.activity ?? null,
|
|
1445
|
+
isLoading: query.isLoading,
|
|
1446
|
+
isError: query.isError,
|
|
1447
|
+
error: query.error,
|
|
1448
|
+
refetch: query.refetch
|
|
1449
|
+
};
|
|
1450
|
+
}
|
|
1451
|
+
function useBarnsportSitemap(baseUrl) {
|
|
1452
|
+
const { client, orgId } = useAxCloudContext();
|
|
1453
|
+
const query = useQuery({
|
|
1454
|
+
queryKey: ["axcloud", "barnsport", "sitemap", orgId, baseUrl],
|
|
1455
|
+
queryFn: () => client.get(`/barnsport/public/${orgId}/sitemap`, {
|
|
1456
|
+
baseUrl
|
|
1457
|
+
}),
|
|
1458
|
+
staleTime: 1e3 * 60 * 15
|
|
1459
|
+
});
|
|
1460
|
+
return {
|
|
1461
|
+
sitemap: query.data ?? null,
|
|
1462
|
+
urls: query.data?.urls ?? [],
|
|
1463
|
+
isLoading: query.isLoading,
|
|
1464
|
+
isError: query.isError,
|
|
1465
|
+
error: query.error,
|
|
1466
|
+
refetch: query.refetch
|
|
1467
|
+
};
|
|
1468
|
+
}
|
|
1469
|
+
function useSubmitBarnsportInterest() {
|
|
1470
|
+
const { client, orgId } = useAxCloudContext();
|
|
1471
|
+
return useMutation({
|
|
1472
|
+
mutationFn: (submission) => client.post(
|
|
1473
|
+
`/barnsport/public/${orgId}/interest`,
|
|
1474
|
+
submission
|
|
1475
|
+
)
|
|
1476
|
+
});
|
|
1477
|
+
}
|
|
1159
1478
|
function LoginButton({
|
|
1160
1479
|
children = "Log in",
|
|
1161
1480
|
returnTo,
|
|
@@ -1399,6 +1718,6 @@ function LinkedAccountsList({
|
|
|
1399
1718
|
] });
|
|
1400
1719
|
}
|
|
1401
1720
|
|
|
1402
|
-
export { AxCloudClient, AxCloudError, AxCloudProvider, LinkedAccountsList, LoginButton, LogoutButton, ModuleGate, ProtectedRoute, createClient, createContentSlotReader, createFormHelper, getClient, getContentSlotMap, isAxCloudError, submitForm, useAuth, useAvatar, useAxCloudContext, useBranding, useContent, useContentItem, useFormStats, useForms, useLinkedAccounts, useLogo, useMedia, useMediaList, useModuleAccess, useMySection, useNews, useOrg, usePageContent, useSections, useUpdateFormSubmission, useUser, userHasAllPermissions, userHasAnyPermission, userHasPermission };
|
|
1721
|
+
export { AxCloudClient, AxCloudError, AxCloudProvider, LinkedAccountsList, LoginButton, LogoutButton, ModuleGate, ProtectedRoute, castVote, castVoteWithCode, checkEligibility, checkVotingCode, createClient, createContentSlotReader, createFormHelper, getBallot, getClient, getContentSlotMap, getVotingReceipt, isAxCloudError, submitForm, useAuth, useAvatar, useAxCloudContext, useBarnsportActivities, useBarnsportActivity, useBarnsportMunicipalities, useBarnsportSitemap, useBarnsportSports, useBranding, useCodeBallot, useContent, useContentItem, useDocumentDownload, useDocuments, useFormStats, useForms, useLinkedAccounts, useLogo, useMedia, useMediaList, useModuleAccess, useMySection, useNews, useOrg, usePageContent, useSections, useSubmitBarnsportInterest, useUpdateFormSubmission, useUser, userHasAllPermissions, userHasAnyPermission, userHasPermission };
|
|
1403
1722
|
//# sourceMappingURL=index.mjs.map
|
|
1404
1723
|
//# sourceMappingURL=index.mjs.map
|