@flowselections/ai-authenticatie 1.0.2
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/dist-lib/_core-safelist.d.ts +2 -0
- package/dist-lib/_core-safelist.d.ts.map +1 -0
- package/dist-lib/_core-safelist.js +15 -0
- package/dist-lib/components/AiAuthenticatieLogo.d.ts +3 -0
- package/dist-lib/components/AiAuthenticatieLogo.d.ts.map +1 -0
- package/dist-lib/components/AiAuthenticatieLogo.js +4 -0
- package/dist-lib/components/AiAuthenticatiePage.d.ts +4 -0
- package/dist-lib/components/AiAuthenticatiePage.d.ts.map +1 -0
- package/dist-lib/components/AiAuthenticatiePage.js +145 -0
- package/dist-lib/components/AiModuleDetailPage.d.ts +2 -0
- package/dist-lib/components/AiModuleDetailPage.d.ts.map +1 -0
- package/dist-lib/components/AiModuleDetailPage.js +43 -0
- package/dist-lib/components/AiModuleTestPanel.d.ts +4 -0
- package/dist-lib/components/AiModuleTestPanel.d.ts.map +1 -0
- package/dist-lib/components/AiModuleTestPanel.js +38 -0
- package/dist-lib/components/AiPeriodFilter.d.ts +7 -0
- package/dist-lib/components/AiPeriodFilter.d.ts.map +1 -0
- package/dist-lib/components/AiPeriodFilter.js +14 -0
- package/dist-lib/components/AiStatTile.d.ts +6 -0
- package/dist-lib/components/AiStatTile.d.ts.map +1 -0
- package/dist-lib/components/AiStatTile.js +5 -0
- package/dist-lib/components/ModuleAgentsDialog.d.ts +14 -0
- package/dist-lib/components/ModuleAgentsDialog.d.ts.map +1 -0
- package/dist-lib/components/ModuleAgentsDialog.js +78 -0
- package/dist-lib/components/ProviderLogo.d.ts +8 -0
- package/dist-lib/components/ProviderLogo.d.ts.map +1 -0
- package/dist-lib/components/ProviderLogo.js +24 -0
- package/dist-lib/components/ProviderManageDialog.d.ts +11 -0
- package/dist-lib/components/ProviderManageDialog.d.ts.map +1 -0
- package/dist-lib/components/ProviderManageDialog.js +173 -0
- package/dist-lib/components/settings/AiAuthenticatieSettingsCard.d.ts +2 -0
- package/dist-lib/components/settings/AiAuthenticatieSettingsCard.d.ts.map +1 -0
- package/dist-lib/components/settings/AiAuthenticatieSettingsCard.js +7 -0
- package/dist-lib/components/settings/MijnModuleSettingsCard.d.ts +2 -0
- package/dist-lib/components/settings/MijnModuleSettingsCard.d.ts.map +1 -0
- package/dist-lib/components/settings/MijnModuleSettingsCard.js +42 -0
- package/dist-lib/hooks/useAdminCredentials.d.ts +14 -0
- package/dist-lib/hooks/useAdminCredentials.d.ts.map +1 -0
- package/dist-lib/hooks/useAdminCredentials.js +17 -0
- package/dist-lib/hooks/useAiAdmin.d.ts +44 -0
- package/dist-lib/hooks/useAiAdmin.d.ts.map +1 -0
- package/dist-lib/hooks/useAiAdmin.js +32 -0
- package/dist-lib/hooks/useAiCostOverview.d.ts +7 -0
- package/dist-lib/hooks/useAiCostOverview.d.ts.map +1 -0
- package/dist-lib/hooks/useAiCostOverview.js +28 -0
- package/dist-lib/hooks/useAiForGoal.d.ts +21 -0
- package/dist-lib/hooks/useAiForGoal.d.ts.map +1 -0
- package/dist-lib/hooks/useAiForGoal.js +40 -0
- package/dist-lib/hooks/useAiForModule.d.ts +11 -0
- package/dist-lib/hooks/useAiForModule.d.ts.map +1 -0
- package/dist-lib/hooks/useAiForModule.js +11 -0
- package/dist-lib/hooks/useAiGoals.d.ts +8 -0
- package/dist-lib/hooks/useAiGoals.d.ts.map +1 -0
- package/dist-lib/hooks/useAiGoals.js +22 -0
- package/dist-lib/hooks/useAiModules.d.ts +15 -0
- package/dist-lib/hooks/useAiModules.d.ts.map +1 -0
- package/dist-lib/hooks/useAiModules.js +59 -0
- package/dist-lib/hooks/useAiPricing.d.ts +20 -0
- package/dist-lib/hooks/useAiPricing.d.ts.map +1 -0
- package/dist-lib/hooks/useAiPricing.js +97 -0
- package/dist-lib/hooks/useAiUsage.d.ts +12 -0
- package/dist-lib/hooks/useAiUsage.d.ts.map +1 -0
- package/dist-lib/hooks/useAiUsage.js +90 -0
- package/dist-lib/hooks/useAiUsageByModule.d.ts +8 -0
- package/dist-lib/hooks/useAiUsageByModule.d.ts.map +1 -0
- package/dist-lib/hooks/useAiUsageByModule.js +22 -0
- package/dist-lib/hooks/useIsAiAdmin.d.ts +6 -0
- package/dist-lib/hooks/useIsAiAdmin.d.ts.map +1 -0
- package/dist-lib/hooks/useIsAiAdmin.js +5 -0
- package/dist-lib/hooks/useMijnModuleData.d.ts +13 -0
- package/dist-lib/hooks/useMijnModuleData.d.ts.map +1 -0
- package/dist-lib/hooks/useMijnModuleData.js +49 -0
- package/dist-lib/hooks/useModules.d.ts +14 -0
- package/dist-lib/hooks/useModules.d.ts.map +1 -0
- package/dist-lib/hooks/useModules.js +47 -0
- package/dist-lib/index.d.ts +29 -0
- package/dist-lib/index.d.ts.map +1 -0
- package/dist-lib/index.js +33 -0
- package/dist-lib/integrations/supabase/auth-attacher.d.ts +2 -0
- package/dist-lib/integrations/supabase/auth-attacher.d.ts.map +1 -0
- package/dist-lib/integrations/supabase/auth-attacher.js +12 -0
- package/dist-lib/integrations/supabase/auth-middleware.d.ts +15971 -0
- package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -0
- package/dist-lib/integrations/supabase/auth-middleware.js +49 -0
- package/dist-lib/integrations/supabase/client.d.ts +15967 -0
- package/dist-lib/integrations/supabase/client.d.ts.map +1 -0
- package/dist-lib/integrations/supabase/client.js +13 -0
- package/dist-lib/integrations/supabase/client.server.d.ts +15967 -0
- package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -0
- package/dist-lib/integrations/supabase/client.server.js +30 -0
- package/dist-lib/integrations/supabase/types.d.ts +16477 -0
- package/dist-lib/integrations/supabase/types.d.ts.map +1 -0
- package/dist-lib/integrations/supabase/types.js +78 -0
- package/dist-lib/lib/aiChat.functions.d.ts +31948 -0
- package/dist-lib/lib/aiChat.functions.d.ts.map +1 -0
- package/dist-lib/lib/aiChat.functions.js +51 -0
- package/dist-lib/lib/aiChat.server.d.ts +8 -0
- package/dist-lib/lib/aiChat.server.d.ts.map +1 -0
- package/dist-lib/lib/aiChat.server.js +347 -0
- package/dist-lib/lib/aiChat.stream.d.ts +33 -0
- package/dist-lib/lib/aiChat.stream.d.ts.map +1 -0
- package/dist-lib/lib/aiChat.stream.js +77 -0
- package/dist-lib/lib/aiChat.stream.server.d.ts +38 -0
- package/dist-lib/lib/aiChat.stream.server.d.ts.map +1 -0
- package/dist-lib/lib/aiChat.stream.server.js +259 -0
- package/dist-lib/lib/aiChat.types.d.ts +63 -0
- package/dist-lib/lib/aiChat.types.d.ts.map +1 -0
- package/dist-lib/lib/aiChat.types.js +1 -0
- package/dist-lib/lib/aiCredentialTest.functions.d.ts +31959 -0
- package/dist-lib/lib/aiCredentialTest.functions.d.ts.map +1 -0
- package/dist-lib/lib/aiCredentialTest.functions.js +714 -0
- package/dist-lib/lib/aiGoals.functions.d.ts +12912 -0
- package/dist-lib/lib/aiGoals.functions.d.ts.map +1 -0
- package/dist-lib/lib/aiGoals.functions.js +14 -0
- package/dist-lib/lib/aiModules.functions.d.ts +95851 -0
- package/dist-lib/lib/aiModules.functions.d.ts.map +1 -0
- package/dist-lib/lib/aiModules.functions.js +41 -0
- package/dist-lib/lib/aiModules.server.d.ts +65 -0
- package/dist-lib/lib/aiModules.server.d.ts.map +1 -0
- package/dist-lib/lib/aiModules.server.js +119 -0
- package/dist-lib/lib/aiPeriod.d.ts +11 -0
- package/dist-lib/lib/aiPeriod.d.ts.map +1 -0
- package/dist-lib/lib/aiPeriod.js +53 -0
- package/dist-lib/lib/aiPricing.functions.d.ts +31943 -0
- package/dist-lib/lib/aiPricing.functions.d.ts.map +1 -0
- package/dist-lib/lib/aiPricing.functions.js +13 -0
- package/dist-lib/lib/aiPricing.server.d.ts +19 -0
- package/dist-lib/lib/aiPricing.server.d.ts.map +1 -0
- package/dist-lib/lib/aiPricing.server.js +97 -0
- package/dist-lib/lib/aiUsage.functions.d.ts +5 -0
- package/dist-lib/lib/aiUsage.functions.d.ts.map +1 -0
- package/dist-lib/lib/aiUsage.functions.js +12 -0
- package/dist-lib/lib/aiUsage.server.d.ts +3 -0
- package/dist-lib/lib/aiUsage.server.d.ts.map +1 -0
- package/dist-lib/lib/aiUsage.server.js +229 -0
- package/dist-lib/lib/aiUsage.types.d.ts +21 -0
- package/dist-lib/lib/aiUsage.types.d.ts.map +1 -0
- package/dist-lib/lib/aiUsage.types.js +1 -0
- package/dist-lib/lib/aiUsageByModule.functions.d.ts +31952 -0
- package/dist-lib/lib/aiUsageByModule.functions.d.ts.map +1 -0
- package/dist-lib/lib/aiUsageByModule.functions.js +37 -0
- package/dist-lib/lib/modules.functions.d.ts +47924 -0
- package/dist-lib/lib/modules.functions.d.ts.map +1 -0
- package/dist-lib/lib/modules.functions.js +21 -0
- package/dist-lib/lib/modules.server.d.ts +23 -0
- package/dist-lib/lib/modules.server.d.ts.map +1 -0
- package/dist-lib/lib/modules.server.js +52 -0
- package/dist-lib/lib/utils.d.ts +3 -0
- package/dist-lib/lib/utils.d.ts.map +1 -0
- package/dist-lib/lib/utils.js +5 -0
- package/dist-lib/lib/validationSchemas.d.ts +15 -0
- package/dist-lib/lib/validationSchemas.d.ts.map +1 -0
- package/dist-lib/lib/validationSchemas.js +25 -0
- package/dist-lib/styles.css +1 -0
- package/package.json +92 -0
- package/public/flowselections-assets/ai-authenticatie/claude.png +0 -0
- package/public/flowselections-assets/ai-authenticatie/gemini.png +0 -0
- package/public/flowselections-assets/ai-authenticatie/openai.png +0 -0
- package/public/logo.png +0 -0
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { type ModelPricingRow } from '../lib/aiPricing.functions';
|
|
2
|
+
export type ProviderPricingSummary = {
|
|
3
|
+
provider_slug: string;
|
|
4
|
+
min_input: number | null;
|
|
5
|
+
min_output: number | null;
|
|
6
|
+
model_count: number;
|
|
7
|
+
fetched_at: string | null;
|
|
8
|
+
};
|
|
9
|
+
export declare function useModelPricing(): {
|
|
10
|
+
rows: ModelPricingRow[];
|
|
11
|
+
loading: boolean;
|
|
12
|
+
refreshing: boolean;
|
|
13
|
+
refresh: (force?: boolean) => Promise<void>;
|
|
14
|
+
reload: () => Promise<void>;
|
|
15
|
+
};
|
|
16
|
+
export declare function pricingByModelSlug(rows: ModelPricingRow[]): Map<string, ModelPricingRow>;
|
|
17
|
+
export declare function providerSummaries(rows: ModelPricingRow[]): Map<string, ProviderPricingSummary>;
|
|
18
|
+
export declare function formatUsd(v: number | null | undefined, digits?: number): string;
|
|
19
|
+
export declare function formatTokens(n: number | null | undefined): string;
|
|
20
|
+
//# sourceMappingURL=useAiPricing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAiPricing.d.ts","sourceRoot":"","sources":["../../src/hooks/useAiPricing.ts"],"names":[],"mappings":"AAGA,OAAO,EAAgD,KAAK,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAEhH,MAAM,MAAM,sBAAsB,GAAG;IACnC,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B,CAAC;AAEF,wBAAgB,eAAe;;;;;;EAuC9B;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,eAAe,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,CAIxF;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,eAAe,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAoB9F;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,MAAM,SAAI,GAAG,MAAM,CAM1E;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAKjE"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { useCallback, useEffect, useState } from 'react';
|
|
2
|
+
import { supabase } from '@flowselections/core';
|
|
3
|
+
import { useServerFn } from '@tanstack/react-start';
|
|
4
|
+
import { ensureModelPricingFresh, refreshModelPricing } from '../lib/aiPricing.functions';
|
|
5
|
+
export function useModelPricing() {
|
|
6
|
+
const [rows, setRows] = useState([]);
|
|
7
|
+
const [loading, setLoading] = useState(true);
|
|
8
|
+
const [refreshing, setRefreshing] = useState(false);
|
|
9
|
+
const ensureFresh = useServerFn(ensureModelPricingFresh);
|
|
10
|
+
const forceRefresh = useServerFn(refreshModelPricing);
|
|
11
|
+
const load = useCallback(async () => {
|
|
12
|
+
const { data } = await supabase.from('ai_model_pricing').select('*');
|
|
13
|
+
setRows(Array.isArray(data) ? data : []);
|
|
14
|
+
setLoading(false);
|
|
15
|
+
}, []);
|
|
16
|
+
const refresh = useCallback(async (force = false) => {
|
|
17
|
+
setRefreshing(true);
|
|
18
|
+
try {
|
|
19
|
+
try {
|
|
20
|
+
if (force)
|
|
21
|
+
await forceRefresh();
|
|
22
|
+
else
|
|
23
|
+
await ensureFresh();
|
|
24
|
+
}
|
|
25
|
+
catch (e) {
|
|
26
|
+
console.warn('Tarieven vernieuwen mislukt', e);
|
|
27
|
+
}
|
|
28
|
+
await load();
|
|
29
|
+
}
|
|
30
|
+
finally {
|
|
31
|
+
setRefreshing(false);
|
|
32
|
+
}
|
|
33
|
+
}, [ensureFresh, forceRefresh, load]);
|
|
34
|
+
useEffect(() => {
|
|
35
|
+
let cancelled = false;
|
|
36
|
+
void (async () => {
|
|
37
|
+
await load();
|
|
38
|
+
try {
|
|
39
|
+
await ensureFresh();
|
|
40
|
+
}
|
|
41
|
+
catch { /* ignore */ }
|
|
42
|
+
if (!cancelled)
|
|
43
|
+
await load();
|
|
44
|
+
})();
|
|
45
|
+
return () => { cancelled = true; };
|
|
46
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
47
|
+
}, []);
|
|
48
|
+
return { rows, loading, refreshing, refresh, reload: load };
|
|
49
|
+
}
|
|
50
|
+
export function pricingByModelSlug(rows) {
|
|
51
|
+
const map = new Map();
|
|
52
|
+
for (const r of rows)
|
|
53
|
+
map.set(`${r.provider_slug}::${r.model_slug}`, r);
|
|
54
|
+
return map;
|
|
55
|
+
}
|
|
56
|
+
export function providerSummaries(rows) {
|
|
57
|
+
const out = new Map();
|
|
58
|
+
for (const r of rows) {
|
|
59
|
+
const prev = out.get(r.provider_slug);
|
|
60
|
+
const minIn = r.input_per_mtok;
|
|
61
|
+
const minOut = r.output_per_mtok;
|
|
62
|
+
if (!prev) {
|
|
63
|
+
out.set(r.provider_slug, {
|
|
64
|
+
provider_slug: r.provider_slug,
|
|
65
|
+
min_input: minIn, min_output: minOut,
|
|
66
|
+
model_count: 1, fetched_at: r.fetched_at,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
prev.model_count += 1;
|
|
71
|
+
if (minIn !== null && (prev.min_input === null || minIn < prev.min_input))
|
|
72
|
+
prev.min_input = minIn;
|
|
73
|
+
if (minOut !== null && (prev.min_output === null || minOut < prev.min_output))
|
|
74
|
+
prev.min_output = minOut;
|
|
75
|
+
if (r.fetched_at && (!prev.fetched_at || r.fetched_at > prev.fetched_at))
|
|
76
|
+
prev.fetched_at = r.fetched_at;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return out;
|
|
80
|
+
}
|
|
81
|
+
export function formatUsd(v, digits = 2) {
|
|
82
|
+
if (v === null || v === undefined || !Number.isFinite(v))
|
|
83
|
+
return '—';
|
|
84
|
+
return new Intl.NumberFormat('nl-NL', {
|
|
85
|
+
style: 'currency', currency: 'USD',
|
|
86
|
+
minimumFractionDigits: digits, maximumFractionDigits: digits,
|
|
87
|
+
}).format(v);
|
|
88
|
+
}
|
|
89
|
+
export function formatTokens(n) {
|
|
90
|
+
if (!n)
|
|
91
|
+
return '0';
|
|
92
|
+
if (n >= 1000000)
|
|
93
|
+
return `${(n / 1000000).toFixed(1)}M`;
|
|
94
|
+
if (n >= 1000)
|
|
95
|
+
return `${(n / 1000).toFixed(1)}K`;
|
|
96
|
+
return String(n);
|
|
97
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type ProviderUsageResult } from '../lib/aiUsage.functions';
|
|
2
|
+
export declare function useProviderUsage(providerSlug: string | null | undefined): {
|
|
3
|
+
data: ProviderUsageResult | null;
|
|
4
|
+
loading: boolean;
|
|
5
|
+
reload: () => Promise<void>;
|
|
6
|
+
};
|
|
7
|
+
export declare function useAllProviderUsage(providerSlugs: string[]): {
|
|
8
|
+
byProvider: Record<string, ProviderUsageResult | null>;
|
|
9
|
+
loading: boolean;
|
|
10
|
+
reload: () => Promise<void>;
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=useAiUsage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAiUsage.d.ts","sourceRoot":"","sources":["../../src/hooks/useAiUsage.ts"],"names":[],"mappings":"AAGA,OAAO,EAAsB,KAAK,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAyBxF,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS;;;;EAwBvE;AAED,wBAAgB,mBAAmB,CAAC,aAAa,EAAE,MAAM,EAAE;;;;EAiC1D"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { useCallback, useEffect, useState } from 'react';
|
|
2
|
+
import { useServerFn } from '@tanstack/react-start';
|
|
3
|
+
import { supabase } from '@flowselections/core';
|
|
4
|
+
import { fetchProviderUsage } from '../lib/aiUsage.functions';
|
|
5
|
+
function usageFallback(providerSlug, message) {
|
|
6
|
+
return {
|
|
7
|
+
ok: false,
|
|
8
|
+
supported: true,
|
|
9
|
+
provider_slug: providerSlug,
|
|
10
|
+
total_cost_usd: 0,
|
|
11
|
+
currency: 'USD',
|
|
12
|
+
input_tokens: 0,
|
|
13
|
+
output_tokens: 0,
|
|
14
|
+
lines: [],
|
|
15
|
+
period_start: '',
|
|
16
|
+
period_end: '',
|
|
17
|
+
fetched_at: '',
|
|
18
|
+
message,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
function errorMessage(error) {
|
|
22
|
+
if (error instanceof Response)
|
|
23
|
+
return error.statusText || `Ophalen mislukt (${error.status})`;
|
|
24
|
+
if (error instanceof Error)
|
|
25
|
+
return error.message;
|
|
26
|
+
return 'Ophalen mislukt';
|
|
27
|
+
}
|
|
28
|
+
export function useProviderUsage(providerSlug) {
|
|
29
|
+
const [data, setData] = useState(null);
|
|
30
|
+
const [loading, setLoading] = useState(false);
|
|
31
|
+
const fetchFn = useServerFn(fetchProviderUsage);
|
|
32
|
+
const load = useCallback(async () => {
|
|
33
|
+
if (!providerSlug)
|
|
34
|
+
return;
|
|
35
|
+
setLoading(true);
|
|
36
|
+
try {
|
|
37
|
+
const { data: authData, error: authError } = await supabase.auth.getUser();
|
|
38
|
+
if (authError || !authData.user) {
|
|
39
|
+
setData(usageFallback(providerSlug, 'Je sessie is verlopen of ongeldig. Meld je opnieuw aan.'));
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
const res = await fetchFn({ data: { providerSlug } });
|
|
43
|
+
setData(res);
|
|
44
|
+
}
|
|
45
|
+
catch (e) {
|
|
46
|
+
setData(usageFallback(providerSlug, errorMessage(e)));
|
|
47
|
+
}
|
|
48
|
+
finally {
|
|
49
|
+
setLoading(false);
|
|
50
|
+
}
|
|
51
|
+
}, [providerSlug, fetchFn]);
|
|
52
|
+
useEffect(() => { void load(); }, [load]);
|
|
53
|
+
return { data, loading, reload: load };
|
|
54
|
+
}
|
|
55
|
+
export function useAllProviderUsage(providerSlugs) {
|
|
56
|
+
const [byProvider, setByProvider] = useState({});
|
|
57
|
+
const [loading, setLoading] = useState(false);
|
|
58
|
+
const fetchFn = useServerFn(fetchProviderUsage);
|
|
59
|
+
const load = useCallback(async () => {
|
|
60
|
+
if (providerSlugs.length === 0)
|
|
61
|
+
return;
|
|
62
|
+
setLoading(true);
|
|
63
|
+
try {
|
|
64
|
+
const { data: authData, error: authError } = await supabase.auth.getUser();
|
|
65
|
+
if (authError || !authData.user) {
|
|
66
|
+
setByProvider(Object.fromEntries(providerSlugs.map(slug => [
|
|
67
|
+
slug,
|
|
68
|
+
usageFallback(slug, 'Je sessie is verlopen of ongeldig. Meld je opnieuw aan.'),
|
|
69
|
+
])));
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
const results = await Promise.all(providerSlugs.map(async (slug) => {
|
|
73
|
+
try {
|
|
74
|
+
const r = await fetchFn({ data: { providerSlug: slug } });
|
|
75
|
+
return [slug, r];
|
|
76
|
+
}
|
|
77
|
+
catch (e) {
|
|
78
|
+
return [slug, usageFallback(slug, errorMessage(e))];
|
|
79
|
+
}
|
|
80
|
+
}));
|
|
81
|
+
setByProvider(Object.fromEntries(results));
|
|
82
|
+
}
|
|
83
|
+
finally {
|
|
84
|
+
setLoading(false);
|
|
85
|
+
}
|
|
86
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
87
|
+
}, [providerSlugs.join('|'), fetchFn]);
|
|
88
|
+
useEffect(() => { void load(); }, [load]);
|
|
89
|
+
return { byProvider, loading, reload: load };
|
|
90
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type AiUsageByModuleRow } from '../lib/aiUsageByModule.functions';
|
|
2
|
+
export type { AiUsageByModuleRow };
|
|
3
|
+
export declare function useAiUsageByModule(days?: number): {
|
|
4
|
+
rows: AiUsageByModuleRow[];
|
|
5
|
+
loading: boolean;
|
|
6
|
+
reload: () => Promise<void>;
|
|
7
|
+
};
|
|
8
|
+
//# sourceMappingURL=useAiUsageByModule.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAiUsageByModule.d.ts","sourceRoot":"","sources":["../../src/hooks/useAiUsageByModule.ts"],"names":[],"mappings":"AAEA,OAAO,EAAsB,KAAK,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAE/F,YAAY,EAAE,kBAAkB,EAAE,CAAC;AAEnC,wBAAgB,kBAAkB,CAAC,IAAI,GAAE,MAAW;;;;EAcnD"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { useCallback, useEffect, useState } from 'react';
|
|
2
|
+
import { useServerFn } from '@tanstack/react-start';
|
|
3
|
+
import { getAiUsageByModule } from '../lib/aiUsageByModule.functions';
|
|
4
|
+
export function useAiUsageByModule(days = 30) {
|
|
5
|
+
const fn = useServerFn(getAiUsageByModule);
|
|
6
|
+
const [rows, setRows] = useState([]);
|
|
7
|
+
const [loading, setLoading] = useState(true);
|
|
8
|
+
const reload = useCallback(async () => {
|
|
9
|
+
setLoading(true);
|
|
10
|
+
try {
|
|
11
|
+
setRows(await fn({ data: { days } }));
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
setRows([]);
|
|
15
|
+
}
|
|
16
|
+
finally {
|
|
17
|
+
setLoading(false);
|
|
18
|
+
}
|
|
19
|
+
}, [fn, days]);
|
|
20
|
+
useEffect(() => { void reload(); }, [reload]);
|
|
21
|
+
return { rows, loading, reload };
|
|
22
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useIsAiAdmin.d.ts","sourceRoot":"","sources":["../../src/hooks/useIsAiAdmin.ts"],"names":[],"mappings":"AAEA,wBAAgB,YAAY;aAEA,OAAO,GAAG,IAAI;;;EACzC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
interface MijnItem {
|
|
2
|
+
id: string;
|
|
3
|
+
created_at: string;
|
|
4
|
+
[key: string]: unknown;
|
|
5
|
+
}
|
|
6
|
+
export declare function useMijnModuleData(): {
|
|
7
|
+
items: MijnItem[];
|
|
8
|
+
loading: boolean;
|
|
9
|
+
error: string | null;
|
|
10
|
+
reload: () => Promise<void>;
|
|
11
|
+
};
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=useMijnModuleData.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useMijnModuleData.d.ts","sourceRoot":"","sources":["../../src/hooks/useMijnModuleData.ts"],"names":[],"mappings":"AAkBA,UAAU,QAAQ;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,wBAAgB,iBAAiB;;;;;EAkChC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// src/hooks/useMijnModuleData.ts — EXAMPLE DATA HOOK
|
|
3
|
+
// ============================================================================
|
|
4
|
+
// Put your data fetching logic in hooks like this, not directly in components.
|
|
5
|
+
// This keeps your pages clean and makes it easy to reuse data across pages.
|
|
6
|
+
//
|
|
7
|
+
// WHAT TO DO:
|
|
8
|
+
// - Rename to match your data (e.g. useProducts, useOrders, useSuppliers)
|
|
9
|
+
// - Replace the example query with your real Supabase query
|
|
10
|
+
// - Replace MijnItem with your actual table's row type
|
|
11
|
+
// - Import and use in your page components
|
|
12
|
+
// - Delete this file if you prefer a different pattern
|
|
13
|
+
// ============================================================================
|
|
14
|
+
import { useState, useEffect, useCallback } from "react";
|
|
15
|
+
import { supabase, toast } from "@flowselections/core";
|
|
16
|
+
export function useMijnModuleData() {
|
|
17
|
+
const [items, setItems] = useState([]);
|
|
18
|
+
const [loading, setLoading] = useState(true);
|
|
19
|
+
const [error, setError] = useState(null);
|
|
20
|
+
const load = useCallback(async () => {
|
|
21
|
+
setLoading(true);
|
|
22
|
+
setError(null);
|
|
23
|
+
try {
|
|
24
|
+
const { data, error } = await supabase
|
|
25
|
+
.from("products") // ← CHANGE THIS to your table
|
|
26
|
+
.select("*")
|
|
27
|
+
.order("created_at", { ascending: false });
|
|
28
|
+
if (error)
|
|
29
|
+
throw error;
|
|
30
|
+
setItems(data ?? []);
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
setError("Fout bij het laden van gegevens");
|
|
34
|
+
toast.error("Fout bij het laden van gegevens");
|
|
35
|
+
}
|
|
36
|
+
finally {
|
|
37
|
+
setLoading(false);
|
|
38
|
+
}
|
|
39
|
+
}, []);
|
|
40
|
+
useEffect(() => {
|
|
41
|
+
load();
|
|
42
|
+
}, [load]);
|
|
43
|
+
return {
|
|
44
|
+
items,
|
|
45
|
+
loading,
|
|
46
|
+
error,
|
|
47
|
+
reload: load,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type ModuleRow, type ModuleMutationResult } from '../lib/modules.functions';
|
|
2
|
+
export type { ModuleRow };
|
|
3
|
+
export declare function useModules(): {
|
|
4
|
+
registered: ModuleRow[];
|
|
5
|
+
loading: boolean;
|
|
6
|
+
reload: () => Promise<void>;
|
|
7
|
+
register: (input: {
|
|
8
|
+
module_key?: string;
|
|
9
|
+
module_name: string;
|
|
10
|
+
description?: string | null;
|
|
11
|
+
}) => Promise<ModuleMutationResult>;
|
|
12
|
+
setActive: (module_key: string, is_active: boolean) => Promise<ModuleMutationResult>;
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=useModules.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useModules.d.ts","sourceRoot":"","sources":["../../src/hooks/useModules.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,SAAS,EAAE,KAAK,oBAAoB,EAC1C,MAAM,0BAA0B,CAAC;AAElC,YAAY,EAAE,SAAS,EAAE,CAAC;AAE1B,wBAAgB,UAAU;;;;sBAkBf;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,KAC/E,OAAO,CAAC,oBAAoB,CAAC;4BAUiB,MAAM,aAAa,OAAO,KAAG,OAAO,CAAC,oBAAoB,CAAC;EAW5G"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { useCallback, useEffect, useState } from 'react';
|
|
2
|
+
import { useServerFn } from '@tanstack/react-start';
|
|
3
|
+
import { listModules, registerModule, setModuleActiveFn, } from '../lib/modules.functions';
|
|
4
|
+
export function useModules() {
|
|
5
|
+
const listFn = useServerFn(listModules);
|
|
6
|
+
const registerFn = useServerFn(registerModule);
|
|
7
|
+
const activeFn = useServerFn(setModuleActiveFn);
|
|
8
|
+
const [registered, setRegistered] = useState([]);
|
|
9
|
+
const [loading, setLoading] = useState(true);
|
|
10
|
+
const reload = useCallback(async () => {
|
|
11
|
+
setLoading(true);
|
|
12
|
+
try {
|
|
13
|
+
const rows = await listFn();
|
|
14
|
+
setRegistered(Array.isArray(rows) ? rows : []);
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
setRegistered([]);
|
|
18
|
+
}
|
|
19
|
+
finally {
|
|
20
|
+
setLoading(false);
|
|
21
|
+
}
|
|
22
|
+
}, [listFn]);
|
|
23
|
+
useEffect(() => { void reload(); }, [reload]);
|
|
24
|
+
const register = useCallback(async (input) => {
|
|
25
|
+
try {
|
|
26
|
+
const res = await registerFn({ data: input });
|
|
27
|
+
if (res?.ok)
|
|
28
|
+
await reload();
|
|
29
|
+
return res ?? { ok: false, message: 'Registreren mislukt.' };
|
|
30
|
+
}
|
|
31
|
+
catch (e) {
|
|
32
|
+
return { ok: false, message: e instanceof Error ? e.message : 'Registreren mislukt.' };
|
|
33
|
+
}
|
|
34
|
+
}, [registerFn, reload]);
|
|
35
|
+
const setActive = useCallback(async (module_key, is_active) => {
|
|
36
|
+
try {
|
|
37
|
+
const res = await activeFn({ data: { module_key, is_active } });
|
|
38
|
+
if (res?.ok)
|
|
39
|
+
await reload();
|
|
40
|
+
return res ?? { ok: false, message: 'Opslaan mislukt.' };
|
|
41
|
+
}
|
|
42
|
+
catch (e) {
|
|
43
|
+
return { ok: false, message: e instanceof Error ? e.message : 'Opslaan mislukt.' };
|
|
44
|
+
}
|
|
45
|
+
}, [activeFn, reload]);
|
|
46
|
+
return { registered, loading, reload, register, setActive };
|
|
47
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { FlowModule } from '@flowselections/core';
|
|
2
|
+
export * from './_core-safelist';
|
|
3
|
+
export { AiAuthenticatiePage } from './components/AiAuthenticatiePage';
|
|
4
|
+
export { AiAuthenticatieLogo } from './components/AiAuthenticatieLogo';
|
|
5
|
+
import { AiAuthenticatieSettingsCard } from './components/settings/AiAuthenticatieSettingsCard';
|
|
6
|
+
export { AiAuthenticatieSettingsCard };
|
|
7
|
+
export * from './hooks/useAiAdmin';
|
|
8
|
+
export { runAiChat, describeAiBinding } from './lib/aiChat.functions';
|
|
9
|
+
export { streamAiChat } from './lib/aiChat.stream';
|
|
10
|
+
export type { AiStreamHandlers } from './lib/aiChat.stream';
|
|
11
|
+
export { listAiModules, saveAiModule, setAiModuleEnabled, deleteAiModule, getAiCostOverview, getAiModuleCalls, } from './lib/aiModules.functions';
|
|
12
|
+
export type { AiModuleRow, AiModuleStats, AiCostTotals, AiCostOverview, AiCallLogEntry } from './lib/aiModules.functions';
|
|
13
|
+
export { listModules, registerModule, setModuleActiveFn } from './lib/modules.functions';
|
|
14
|
+
export type { ModuleRow, ModuleMutationResult } from './lib/modules.functions';
|
|
15
|
+
export { useModules } from './hooks/useModules';
|
|
16
|
+
export { getAiUsageByModule, isAiAdmin } from './lib/aiUsageByModule.functions';
|
|
17
|
+
export type { AiUsageByModuleRow } from './lib/aiUsageByModule.functions';
|
|
18
|
+
export type { AiChatMessage, AiChatRole, AiChatOptions, AiChatUsage, AiChatResult, AiChatSuccess, AiChatError, AiChatBindingInfo, } from './lib/aiChat.types';
|
|
19
|
+
export { useAiForGoal } from './hooks/useAiForGoal';
|
|
20
|
+
export type { UseAiForGoalReturn } from './hooks/useAiForGoal';
|
|
21
|
+
export { useAiForModule } from './hooks/useAiForModule';
|
|
22
|
+
export type { UseAiForModuleReturn } from './hooks/useAiForModule';
|
|
23
|
+
export { useAiModules } from './hooks/useAiModules';
|
|
24
|
+
export { useAiCostOverview } from './hooks/useAiCostOverview';
|
|
25
|
+
export { useIsAiAdmin } from './hooks/useIsAiAdmin';
|
|
26
|
+
export { useAiUsageByModule } from './hooks/useAiUsageByModule';
|
|
27
|
+
export { AiModuleDetailPage } from './components/AiModuleDetailPage';
|
|
28
|
+
export declare const aiAuthenticatieModule: FlowModule;
|
|
29
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEvD,cAAc,kBAAkB,CAAC;AACjC,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EAAE,2BAA2B,EAAE,MAAM,mDAAmD,CAAC;AAChG,OAAO,EAAE,2BAA2B,EAAE,CAAC;AACvC,cAAc,oBAAoB,CAAC;AAGnC,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,YAAY,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EACL,aAAa,EAAE,YAAY,EAAE,kBAAkB,EAAE,cAAc,EAAE,iBAAiB,EAAE,gBAAgB,GACrG,MAAM,2BAA2B,CAAC;AACnC,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAG1H,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACzF,YAAY,EAAE,SAAS,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/E,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAIhD,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAC;AAChF,YAAY,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,YAAY,EACV,aAAa,EACb,UAAU,EACV,aAAa,EACb,WAAW,EACX,YAAY,EACZ,aAAa,EACb,WAAW,EACX,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,YAAY,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,YAAY,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAGrE,eAAO,MAAM,qBAAqB,EAAE,UAUnC,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { KeyRound } from 'lucide-react';
|
|
2
|
+
export * from './_core-safelist';
|
|
3
|
+
export { AiAuthenticatiePage } from './components/AiAuthenticatiePage';
|
|
4
|
+
export { AiAuthenticatieLogo } from './components/AiAuthenticatieLogo';
|
|
5
|
+
import { AiAuthenticatieSettingsCard } from './components/settings/AiAuthenticatieSettingsCard';
|
|
6
|
+
export { AiAuthenticatieSettingsCard };
|
|
7
|
+
export * from './hooks/useAiAdmin';
|
|
8
|
+
// Consumer-API voor andere modules
|
|
9
|
+
export { runAiChat, describeAiBinding } from './lib/aiChat.functions';
|
|
10
|
+
export { streamAiChat } from './lib/aiChat.stream';
|
|
11
|
+
export { listAiModules, saveAiModule, setAiModuleEnabled, deleteAiModule, getAiCostOverview, getAiModuleCalls, } from './lib/aiModules.functions';
|
|
12
|
+
// Centrale moduleregistratie
|
|
13
|
+
export { listModules, registerModule, setModuleActiveFn } from './lib/modules.functions';
|
|
14
|
+
export { useModules } from './hooks/useModules';
|
|
15
|
+
export { getAiUsageByModule, isAiAdmin } from './lib/aiUsageByModule.functions';
|
|
16
|
+
export { useAiForGoal } from './hooks/useAiForGoal';
|
|
17
|
+
export { useAiForModule } from './hooks/useAiForModule';
|
|
18
|
+
export { useAiModules } from './hooks/useAiModules';
|
|
19
|
+
export { useAiCostOverview } from './hooks/useAiCostOverview';
|
|
20
|
+
export { useIsAiAdmin } from './hooks/useIsAiAdmin';
|
|
21
|
+
export { useAiUsageByModule } from './hooks/useAiUsageByModule';
|
|
22
|
+
export { AiModuleDetailPage } from './components/AiModuleDetailPage';
|
|
23
|
+
export const aiAuthenticatieModule = {
|
|
24
|
+
id: 'ai-authenticatie',
|
|
25
|
+
name: 'AI-Authenticatie',
|
|
26
|
+
version: '1.0.0',
|
|
27
|
+
nav: {
|
|
28
|
+
label: 'AI-Authenticatie',
|
|
29
|
+
href: '/ai-authenticatie',
|
|
30
|
+
icon: KeyRound,
|
|
31
|
+
},
|
|
32
|
+
settingsCards: [{ component: AiAuthenticatieSettingsCard, order: 10 }],
|
|
33
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-attacher.d.ts","sourceRoot":"","sources":["../../../src/integrations/supabase/auth-attacher.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,kBAAkB,mHAQ9B,CAAA"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// Intentionally overrides the generated attach-supabase-auth: this module
|
|
2
|
+
// authenticates against the shell's supabase client from @flowselections/core,
|
|
3
|
+
// not the local integrations/supabase/client. Do NOT regenerate.
|
|
4
|
+
import { createMiddleware } from '@tanstack/react-start';
|
|
5
|
+
import { supabase } from '@flowselections/core';
|
|
6
|
+
export const attachSupabaseAuth = createMiddleware({ type: 'function' }).client(async ({ next }) => {
|
|
7
|
+
const { data } = await supabase.auth.getSession();
|
|
8
|
+
const token = data.session?.access_token;
|
|
9
|
+
return next({
|
|
10
|
+
headers: token ? { Authorization: `Bearer ${token}` } : {},
|
|
11
|
+
});
|
|
12
|
+
});
|