@unisim/sdk 0.1.4 → 0.2.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.
Files changed (64) hide show
  1. package/README.md +107 -101
  2. package/dist/CompanyMenu.d.ts +42 -0
  3. package/dist/CompanyMenu.d.ts.map +1 -0
  4. package/dist/CompanyMenu.js +148 -0
  5. package/dist/CompanyMenu.js.map +1 -0
  6. package/dist/SuiteSwitcher.d.ts +49 -0
  7. package/dist/SuiteSwitcher.d.ts.map +1 -0
  8. package/dist/SuiteSwitcher.js +232 -0
  9. package/dist/SuiteSwitcher.js.map +1 -0
  10. package/dist/TrialUi.d.ts +16 -0
  11. package/dist/TrialUi.d.ts.map +1 -0
  12. package/dist/TrialUi.js +66 -0
  13. package/dist/TrialUi.js.map +1 -0
  14. package/dist/UniversalBar.d.ts.map +1 -1
  15. package/dist/UniversalBar.js +1 -0
  16. package/dist/UniversalBar.js.map +1 -1
  17. package/dist/access.d.ts.map +1 -1
  18. package/dist/access.js +1 -0
  19. package/dist/access.js.map +1 -1
  20. package/dist/admin.d.ts.map +1 -1
  21. package/dist/admin.js +1 -0
  22. package/dist/admin.js.map +1 -1
  23. package/dist/auth.d.ts.map +1 -1
  24. package/dist/auth.js +1 -0
  25. package/dist/auth.js.map +1 -1
  26. package/dist/branding.d.ts.map +1 -1
  27. package/dist/branding.js +1 -0
  28. package/dist/branding.js.map +1 -1
  29. package/dist/changelog.d.ts.map +1 -1
  30. package/dist/changelog.js +1 -0
  31. package/dist/changelog.js.map +1 -1
  32. package/dist/index.d.ts +17 -1
  33. package/dist/index.d.ts.map +1 -1
  34. package/dist/index.js +8 -0
  35. package/dist/index.js.map +1 -1
  36. package/dist/people.d.ts +45 -0
  37. package/dist/people.d.ts.map +1 -0
  38. package/dist/people.js +190 -0
  39. package/dist/people.js.map +1 -0
  40. package/dist/places.d.ts +23 -0
  41. package/dist/places.d.ts.map +1 -0
  42. package/dist/places.js +66 -0
  43. package/dist/places.js.map +1 -0
  44. package/dist/projects.d.ts +32 -0
  45. package/dist/projects.d.ts.map +1 -0
  46. package/dist/projects.js +71 -0
  47. package/dist/projects.js.map +1 -0
  48. package/dist/provider.d.ts.map +1 -1
  49. package/dist/provider.js +1 -0
  50. package/dist/provider.js.map +1 -1
  51. package/dist/subscription.d.ts +25 -0
  52. package/dist/subscription.d.ts.map +1 -0
  53. package/dist/subscription.js +62 -0
  54. package/dist/subscription.js.map +1 -0
  55. package/dist/trial.d.ts +29 -0
  56. package/dist/trial.d.ts.map +1 -0
  57. package/dist/trial.js +29 -0
  58. package/dist/trial.js.map +1 -0
  59. package/dist/types.d.ts +54 -1
  60. package/dist/types.d.ts.map +1 -1
  61. package/dist/usage.d.ts.map +1 -1
  62. package/dist/usage.js +1 -0
  63. package/dist/usage.js.map +1 -1
  64. package/package.json +61 -48
@@ -0,0 +1,45 @@
1
+ import { useUniversal } from './provider.js';
2
+ import type { Person, Team, TeamMembership, PersonRole } from './types.js';
3
+ export interface UsePeopleResult {
4
+ people: Person[];
5
+ loading: boolean;
6
+ error: Error | null;
7
+ /** Reload the list (after a create/update/delete done outside the hook). */
8
+ refresh: () => void;
9
+ }
10
+ /**
11
+ * People in the active organisation. Driven by the SDK's active-org state, so
12
+ * switching org or signing in/out automatically refetches.
13
+ *
14
+ * For mutations (add / update / delete) use the helpers exported below — they
15
+ * write directly via the supabase client and the caller calls `refresh()`.
16
+ */
17
+ export declare function usePeople(): UsePeopleResult;
18
+ export interface CreatePersonInput {
19
+ name: string;
20
+ email?: string | null;
21
+ job_title?: string | null;
22
+ role?: PersonRole;
23
+ }
24
+ export declare function createPerson(supabase: ReturnType<typeof useUniversal>['supabase'], orgId: string, input: CreatePersonInput): Promise<import("@supabase/postgrest-js").PostgrestSingleResponse<any>>;
25
+ export declare function deletePerson(supabase: ReturnType<typeof useUniversal>['supabase'], personId: string): Promise<import("@supabase/postgrest-js").PostgrestSingleResponse<null>>;
26
+ export interface UseTeamsResult {
27
+ teams: Team[];
28
+ loading: boolean;
29
+ error: Error | null;
30
+ refresh: () => void;
31
+ }
32
+ export declare function useTeams(): UseTeamsResult;
33
+ export declare function createTeam(supabase: ReturnType<typeof useUniversal>['supabase'], orgId: string, name: string, description?: string | null): Promise<import("@supabase/postgrest-js").PostgrestSingleResponse<any>>;
34
+ export declare function deleteTeam(supabase: ReturnType<typeof useUniversal>['supabase'], teamId: string): Promise<import("@supabase/postgrest-js").PostgrestSingleResponse<null>>;
35
+ export interface UseTeamMembershipsResult {
36
+ memberships: TeamMembership[];
37
+ loading: boolean;
38
+ error: Error | null;
39
+ refresh: () => void;
40
+ }
41
+ /** All team memberships across every team in the active org. */
42
+ export declare function useTeamMemberships(): UseTeamMembershipsResult;
43
+ export declare function assignPersonToTeam(supabase: ReturnType<typeof useUniversal>['supabase'], teamId: string, personId: string, teamRole?: string | null): Promise<import("@supabase/postgrest-js").PostgrestSingleResponse<null>>;
44
+ export declare function removePersonFromTeam(supabase: ReturnType<typeof useUniversal>['supabase'], teamId: string, personId: string): Promise<import("@supabase/postgrest-js").PostgrestSingleResponse<null>>;
45
+ //# sourceMappingURL=people.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"people.d.ts","sourceRoot":"","sources":["../src/people.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAE5C,OAAO,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAM1E,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAA;IACnB,4EAA4E;IAC5E,OAAO,EAAE,MAAM,IAAI,CAAA;CACpB;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,IAAI,eAAe,CA2C3C;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,IAAI,CAAC,EAAE,UAAU,CAAA;CAClB;AAED,wBAAsB,YAAY,CAChC,QAAQ,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC,UAAU,CAAC,EACrD,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,iBAAiB,0EAazB;AAED,wBAAsB,YAAY,CAChC,QAAQ,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC,UAAU,CAAC,EACrD,QAAQ,EAAE,MAAM,2EAGjB;AAMD,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,IAAI,EAAE,CAAA;IACb,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAA;IACnB,OAAO,EAAE,MAAM,IAAI,CAAA;CACpB;AAED,wBAAgB,QAAQ,IAAI,cAAc,CA2CzC;AAED,wBAAsB,UAAU,CAC9B,QAAQ,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC,UAAU,CAAC,EACrD,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,WAAW,GAAE,MAAM,GAAG,IAAW,0EAOlC;AAED,wBAAsB,UAAU,CAC9B,QAAQ,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC,UAAU,CAAC,EACrD,MAAM,EAAE,MAAM,2EAGf;AAMD,MAAM,WAAW,wBAAwB;IACvC,WAAW,EAAE,cAAc,EAAE,CAAA;IAC7B,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAA;IACnB,OAAO,EAAE,MAAM,IAAI,CAAA;CACpB;AAED,gEAAgE;AAChE,wBAAgB,kBAAkB,IAAI,wBAAwB,CA6D7D;AAED,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC,UAAU,CAAC,EACrD,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,QAAQ,GAAE,MAAM,GAAG,IAAW,2EAK/B;AAED,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC,UAAU,CAAC,EACrD,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,2EAOjB"}
package/dist/people.js ADDED
@@ -0,0 +1,190 @@
1
+ 'use client';
2
+ import { useEffect, useState, useCallback } from 'react';
3
+ import { useUniversal } from './provider.js';
4
+ import { useOrg } from './auth.js';
5
+ /**
6
+ * People in the active organisation. Driven by the SDK's active-org state, so
7
+ * switching org or signing in/out automatically refetches.
8
+ *
9
+ * For mutations (add / update / delete) use the helpers exported below — they
10
+ * write directly via the supabase client and the caller calls `refresh()`.
11
+ */
12
+ export function usePeople() {
13
+ const { supabase } = useUniversal();
14
+ const { org } = useOrg();
15
+ const [people, setPeople] = useState([]);
16
+ const [loading, setLoading] = useState(true);
17
+ const [error, setError] = useState(null);
18
+ const [reloadKey, setReloadKey] = useState(0);
19
+ useEffect(() => {
20
+ if (!org) {
21
+ setPeople([]);
22
+ setLoading(false);
23
+ return;
24
+ }
25
+ let cancelled = false;
26
+ setLoading(true);
27
+ setError(null);
28
+ supabase
29
+ .from('people')
30
+ .select('*')
31
+ .eq('org_id', org.id)
32
+ .order('name', { ascending: true })
33
+ .then(({ data, error: err }) => {
34
+ if (cancelled)
35
+ return;
36
+ if (err) {
37
+ setError(err);
38
+ setPeople([]);
39
+ }
40
+ else {
41
+ setPeople((data ?? []));
42
+ }
43
+ setLoading(false);
44
+ });
45
+ return () => {
46
+ cancelled = true;
47
+ };
48
+ }, [supabase, org, reloadKey]);
49
+ const refresh = useCallback(() => setReloadKey((k) => k + 1), []);
50
+ return { people, loading, error, refresh };
51
+ }
52
+ export async function createPerson(supabase, orgId, input) {
53
+ return supabase
54
+ .from('people')
55
+ .insert({
56
+ org_id: orgId,
57
+ name: input.name.trim(),
58
+ email: input.email?.trim() || null,
59
+ job_title: input.job_title?.trim() || null,
60
+ role: input.role ?? 'employee',
61
+ })
62
+ .select()
63
+ .single();
64
+ }
65
+ export async function deletePerson(supabase, personId) {
66
+ return supabase.from('people').delete().eq('id', personId);
67
+ }
68
+ export function useTeams() {
69
+ const { supabase } = useUniversal();
70
+ const { org } = useOrg();
71
+ const [teams, setTeams] = useState([]);
72
+ const [loading, setLoading] = useState(true);
73
+ const [error, setError] = useState(null);
74
+ const [reloadKey, setReloadKey] = useState(0);
75
+ useEffect(() => {
76
+ if (!org) {
77
+ setTeams([]);
78
+ setLoading(false);
79
+ return;
80
+ }
81
+ let cancelled = false;
82
+ setLoading(true);
83
+ setError(null);
84
+ supabase
85
+ .from('teams')
86
+ .select('*')
87
+ .eq('org_id', org.id)
88
+ .order('name', { ascending: true })
89
+ .then(({ data, error: err }) => {
90
+ if (cancelled)
91
+ return;
92
+ if (err) {
93
+ setError(err);
94
+ setTeams([]);
95
+ }
96
+ else {
97
+ setTeams((data ?? []));
98
+ }
99
+ setLoading(false);
100
+ });
101
+ return () => {
102
+ cancelled = true;
103
+ };
104
+ }, [supabase, org, reloadKey]);
105
+ const refresh = useCallback(() => setReloadKey((k) => k + 1), []);
106
+ return { teams, loading, error, refresh };
107
+ }
108
+ export async function createTeam(supabase, orgId, name, description = null) {
109
+ return supabase
110
+ .from('teams')
111
+ .insert({ org_id: orgId, name: name.trim(), description })
112
+ .select()
113
+ .single();
114
+ }
115
+ export async function deleteTeam(supabase, teamId) {
116
+ return supabase.from('teams').delete().eq('id', teamId);
117
+ }
118
+ /** All team memberships across every team in the active org. */
119
+ export function useTeamMemberships() {
120
+ const { supabase } = useUniversal();
121
+ const { org } = useOrg();
122
+ const [memberships, setMemberships] = useState([]);
123
+ const [loading, setLoading] = useState(true);
124
+ const [error, setError] = useState(null);
125
+ const [reloadKey, setReloadKey] = useState(0);
126
+ useEffect(() => {
127
+ if (!org) {
128
+ setMemberships([]);
129
+ setLoading(false);
130
+ return;
131
+ }
132
+ let cancelled = false;
133
+ setLoading(true);
134
+ setError(null);
135
+ // No org_id column on team_memberships — join via teams to scope by org.
136
+ // RLS still gates this on the caller's membership; .in() narrows network.
137
+ supabase
138
+ .from('teams')
139
+ .select('id')
140
+ .eq('org_id', org.id)
141
+ .then(async ({ data: teamRows, error: teamErr }) => {
142
+ if (cancelled)
143
+ return;
144
+ if (teamErr || !teamRows) {
145
+ setError(teamErr);
146
+ setMemberships([]);
147
+ setLoading(false);
148
+ return;
149
+ }
150
+ const teamIds = teamRows.map((t) => t.id);
151
+ if (teamIds.length === 0) {
152
+ setMemberships([]);
153
+ setLoading(false);
154
+ return;
155
+ }
156
+ const { data, error: err } = await supabase
157
+ .from('team_memberships')
158
+ .select('*')
159
+ .in('team_id', teamIds);
160
+ if (cancelled)
161
+ return;
162
+ if (err) {
163
+ setError(err);
164
+ setMemberships([]);
165
+ }
166
+ else {
167
+ setMemberships((data ?? []));
168
+ }
169
+ setLoading(false);
170
+ });
171
+ return () => {
172
+ cancelled = true;
173
+ };
174
+ }, [supabase, org, reloadKey]);
175
+ const refresh = useCallback(() => setReloadKey((k) => k + 1), []);
176
+ return { memberships, loading, error, refresh };
177
+ }
178
+ export async function assignPersonToTeam(supabase, teamId, personId, teamRole = null) {
179
+ return supabase
180
+ .from('team_memberships')
181
+ .insert({ team_id: teamId, person_id: personId, team_role: teamRole });
182
+ }
183
+ export async function removePersonFromTeam(supabase, teamId, personId) {
184
+ return supabase
185
+ .from('team_memberships')
186
+ .delete()
187
+ .eq('team_id', teamId)
188
+ .eq('person_id', personId);
189
+ }
190
+ //# sourceMappingURL=people.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"people.js","sourceRoot":"","sources":["../src/people.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { useUniversal } from './provider.js';
2
+ import type { Place, PlaceType } from './types.js';
3
+ export interface UsePlacesResult {
4
+ places: Place[];
5
+ loading: boolean;
6
+ error: Error | null;
7
+ refresh: () => void;
8
+ }
9
+ /**
10
+ * Places (offices / warehouses / sites) in the active organisation.
11
+ * Same pattern as usePeople — driven by the SDK's active org, refetched
12
+ * automatically when org or session changes.
13
+ */
14
+ export declare function usePlaces(): UsePlacesResult;
15
+ export interface CreatePlaceInput {
16
+ name: string;
17
+ address?: string | null;
18
+ place_type?: PlaceType;
19
+ notes?: string | null;
20
+ }
21
+ export declare function createPlace(supabase: ReturnType<typeof useUniversal>['supabase'], orgId: string, input: CreatePlaceInput): Promise<import("@supabase/postgrest-js").PostgrestSingleResponse<any>>;
22
+ export declare function deletePlace(supabase: ReturnType<typeof useUniversal>['supabase'], placeId: string): Promise<import("@supabase/postgrest-js").PostgrestSingleResponse<null>>;
23
+ //# sourceMappingURL=places.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"places.d.ts","sourceRoot":"","sources":["../src/places.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAE5C,OAAO,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAElD,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,KAAK,EAAE,CAAA;IACf,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAA;IACnB,OAAO,EAAE,MAAM,IAAI,CAAA;CACpB;AAED;;;;GAIG;AACH,wBAAgB,SAAS,IAAI,eAAe,CA2C3C;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,UAAU,CAAC,EAAE,SAAS,CAAA;IACtB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACtB;AAED,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC,UAAU,CAAC,EACrD,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,gBAAgB,0EAaxB;AAED,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC,UAAU,CAAC,EACrD,OAAO,EAAE,MAAM,2EAGhB"}
package/dist/places.js ADDED
@@ -0,0 +1,66 @@
1
+ 'use client';
2
+ import { useEffect, useState, useCallback } from 'react';
3
+ import { useUniversal } from './provider.js';
4
+ import { useOrg } from './auth.js';
5
+ /**
6
+ * Places (offices / warehouses / sites) in the active organisation.
7
+ * Same pattern as usePeople — driven by the SDK's active org, refetched
8
+ * automatically when org or session changes.
9
+ */
10
+ export function usePlaces() {
11
+ const { supabase } = useUniversal();
12
+ const { org } = useOrg();
13
+ const [places, setPlaces] = useState([]);
14
+ const [loading, setLoading] = useState(true);
15
+ const [error, setError] = useState(null);
16
+ const [reloadKey, setReloadKey] = useState(0);
17
+ useEffect(() => {
18
+ if (!org) {
19
+ setPlaces([]);
20
+ setLoading(false);
21
+ return;
22
+ }
23
+ let cancelled = false;
24
+ setLoading(true);
25
+ setError(null);
26
+ supabase
27
+ .from('places')
28
+ .select('*')
29
+ .eq('org_id', org.id)
30
+ .order('name', { ascending: true })
31
+ .then(({ data, error: err }) => {
32
+ if (cancelled)
33
+ return;
34
+ if (err) {
35
+ setError(err);
36
+ setPlaces([]);
37
+ }
38
+ else {
39
+ setPlaces((data ?? []));
40
+ }
41
+ setLoading(false);
42
+ });
43
+ return () => {
44
+ cancelled = true;
45
+ };
46
+ }, [supabase, org, reloadKey]);
47
+ const refresh = useCallback(() => setReloadKey((k) => k + 1), []);
48
+ return { places, loading, error, refresh };
49
+ }
50
+ export async function createPlace(supabase, orgId, input) {
51
+ return supabase
52
+ .from('places')
53
+ .insert({
54
+ org_id: orgId,
55
+ name: input.name.trim(),
56
+ address: input.address?.trim() || null,
57
+ place_type: input.place_type ?? 'office',
58
+ notes: input.notes?.trim() || null,
59
+ })
60
+ .select()
61
+ .single();
62
+ }
63
+ export async function deletePlace(supabase, placeId) {
64
+ return supabase.from('places').delete().eq('id', placeId);
65
+ }
66
+ //# sourceMappingURL=places.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"places.js","sourceRoot":"","sources":["../src/places.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import { useUniversal } from './provider.js';
2
+ import type { Project, ProjectStatus } from './types.js';
3
+ export interface UseProjectsOptions {
4
+ /** Filter by status. Omit to return everything in the org. */
5
+ status?: ProjectStatus;
6
+ }
7
+ export interface UseProjectsResult {
8
+ projects: Project[];
9
+ loading: boolean;
10
+ error: Error | null;
11
+ refresh: () => void;
12
+ }
13
+ /**
14
+ * Projects in the active org. Optionally filtered by status.
15
+ *
16
+ * Each Assess product will later use this to populate their "which project
17
+ * does this assessment belong to" picker — that's why it lives in the SDK
18
+ * rather than each consumer rolling their own.
19
+ */
20
+ export declare function useProjects(opts?: UseProjectsOptions): UseProjectsResult;
21
+ export interface CreateProjectInput {
22
+ name: string;
23
+ description?: string | null;
24
+ place_id?: string | null;
25
+ starts_on?: string | null;
26
+ ends_on?: string | null;
27
+ status?: ProjectStatus;
28
+ }
29
+ export declare function createProject(supabase: ReturnType<typeof useUniversal>['supabase'], orgId: string, input: CreateProjectInput): Promise<import("@supabase/postgrest-js").PostgrestSingleResponse<any>>;
30
+ export declare function updateProjectStatus(supabase: ReturnType<typeof useUniversal>['supabase'], projectId: string, status: ProjectStatus): Promise<import("@supabase/postgrest-js").PostgrestSingleResponse<null>>;
31
+ export declare function deleteProject(supabase: ReturnType<typeof useUniversal>['supabase'], projectId: string): Promise<import("@supabase/postgrest-js").PostgrestSingleResponse<null>>;
32
+ //# sourceMappingURL=projects.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../src/projects.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAE5C,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAExD,MAAM,WAAW,kBAAkB;IACjC,8DAA8D;IAC9D,MAAM,CAAC,EAAE,aAAa,CAAA;CACvB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,OAAO,EAAE,CAAA;IACnB,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAA;IACnB,OAAO,EAAE,MAAM,IAAI,CAAA;CACpB;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,IAAI,GAAE,kBAAuB,GAAG,iBAAiB,CAyC5E;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,MAAM,CAAC,EAAE,aAAa,CAAA;CACvB;AAED,wBAAsB,aAAa,CACjC,QAAQ,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC,UAAU,CAAC,EACrD,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,kBAAkB,0EAe1B;AAED,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC,UAAU,CAAC,EACrD,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,aAAa,2EAGtB;AAED,wBAAsB,aAAa,CACjC,QAAQ,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC,UAAU,CAAC,EACrD,SAAS,EAAE,MAAM,2EAGlB"}
@@ -0,0 +1,71 @@
1
+ 'use client';
2
+ import { useEffect, useState, useCallback } from 'react';
3
+ import { useUniversal } from './provider.js';
4
+ import { useOrg } from './auth.js';
5
+ /**
6
+ * Projects in the active org. Optionally filtered by status.
7
+ *
8
+ * Each Assess product will later use this to populate their "which project
9
+ * does this assessment belong to" picker — that's why it lives in the SDK
10
+ * rather than each consumer rolling their own.
11
+ */
12
+ export function useProjects(opts = {}) {
13
+ const { supabase } = useUniversal();
14
+ const { org } = useOrg();
15
+ const [projects, setProjects] = useState([]);
16
+ const [loading, setLoading] = useState(true);
17
+ const [error, setError] = useState(null);
18
+ const [reloadKey, setReloadKey] = useState(0);
19
+ useEffect(() => {
20
+ if (!org) {
21
+ setProjects([]);
22
+ setLoading(false);
23
+ return;
24
+ }
25
+ let cancelled = false;
26
+ setLoading(true);
27
+ setError(null);
28
+ let q = supabase.from('projects').select('*').eq('org_id', org.id);
29
+ if (opts.status)
30
+ q = q.eq('status', opts.status);
31
+ q.order('created_at', { ascending: false }).then(({ data, error: err }) => {
32
+ if (cancelled)
33
+ return;
34
+ if (err) {
35
+ setError(err);
36
+ setProjects([]);
37
+ }
38
+ else {
39
+ setProjects((data ?? []));
40
+ }
41
+ setLoading(false);
42
+ });
43
+ return () => {
44
+ cancelled = true;
45
+ };
46
+ }, [supabase, org, opts.status, reloadKey]);
47
+ const refresh = useCallback(() => setReloadKey((k) => k + 1), []);
48
+ return { projects, loading, error, refresh };
49
+ }
50
+ export async function createProject(supabase, orgId, input) {
51
+ return supabase
52
+ .from('projects')
53
+ .insert({
54
+ org_id: orgId,
55
+ name: input.name.trim(),
56
+ description: input.description?.trim() || null,
57
+ place_id: input.place_id ?? null,
58
+ starts_on: input.starts_on ?? null,
59
+ ends_on: input.ends_on ?? null,
60
+ status: input.status ?? 'active',
61
+ })
62
+ .select()
63
+ .single();
64
+ }
65
+ export async function updateProjectStatus(supabase, projectId, status) {
66
+ return supabase.from('projects').update({ status }).eq('id', projectId);
67
+ }
68
+ export async function deleteProject(supabase, projectId) {
69
+ return supabase.from('projects').delete().eq('id', projectId);
70
+ }
71
+ //# sourceMappingURL=projects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projects.js","sourceRoot":"","sources":["../src/projects.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../src/provider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,cAAc,EAAE,KAAK,OAAO,EAAE,MAAM,uBAAuB,CAAA;AACvF,OAAO,EAOL,KAAK,SAAS,EACf,MAAM,OAAO,CAAA;AACd,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAE7C,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAA;IACnB,eAAe,EAAE,MAAM,CAAA;IACvB,OAAO,EAAE,WAAW,CAAA;IACpB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,UAAU,qBAAqB;IAC7B,MAAM,EAAE,eAAe,CAAA;IACvB,QAAQ,EAAE,cAAc,CAAA;IACxB,OAAO,EAAE,OAAO,GAAG,IAAI,CAAA;IACvB,OAAO,EAAE,OAAO,CAAA;IAChB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAA;CAC/C;AAMD,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,eAAe,CAAA;IACvB,QAAQ,EAAE,SAAS,CAAA;CACpB;AAED,wBAAgB,iBAAiB,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,sBAAsB,2CA6D7E;AAED,wBAAgB,YAAY,IAAI,qBAAqB,CAMpD"}
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../src/provider.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAgB,KAAK,cAAc,EAAE,KAAK,OAAO,EAAE,MAAM,uBAAuB,CAAA;AACvF,OAAO,EAOL,KAAK,SAAS,EACf,MAAM,OAAO,CAAA;AACd,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAE7C,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAA;IACnB,eAAe,EAAE,MAAM,CAAA;IACvB,OAAO,EAAE,WAAW,CAAA;IACpB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,UAAU,qBAAqB;IAC7B,MAAM,EAAE,eAAe,CAAA;IACvB,QAAQ,EAAE,cAAc,CAAA;IACxB,OAAO,EAAE,OAAO,GAAG,IAAI,CAAA;IACvB,OAAO,EAAE,OAAO,CAAA;IAChB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAA;CAC/C;AAMD,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,eAAe,CAAA;IACvB,QAAQ,EAAE,SAAS,CAAA;CACpB;AAED,wBAAgB,iBAAiB,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,sBAAsB,2CA6D7E;AAED,wBAAgB,YAAY,IAAI,qBAAqB,CAMpD"}
package/dist/provider.js CHANGED
@@ -1,3 +1,4 @@
1
+ 'use client';
1
2
  import { jsx as _jsx } from "react/jsx-runtime";
2
3
  import { createClient } from '@supabase/supabase-js';
3
4
  import { createContext, useContext, useEffect, useMemo, useRef, useState, } from 'react';
@@ -1 +1 @@
1
- {"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EAAE,YAAY,EAAqC,MAAM,uBAAuB,CAAA;AACvF,OAAO,EACL,aAAa,EACb,UAAU,EACV,SAAS,EACT,OAAO,EACP,MAAM,EACN,QAAQ,GAET,MAAM,OAAO,CAAA;AAoBd,MAAM,gBAAgB,GAAG,aAAa,CAA+B,IAAI,CAAC,CAAA;AAE1E,MAAM,sBAAsB,GAAG,yBAAyB,CAAA;AAOxD,MAAM,UAAU,iBAAiB,CAAC,EAAE,MAAM,EAAE,QAAQ,EAA0B;IAC5E,MAAM,QAAQ,GAAG,OAAO,CACtB,GAAG,EAAE,CACH,YAAY,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,eAAe,EAAE;QACvD,IAAI,EAAE;YACJ,cAAc,EAAE,IAAI;YACpB,gBAAgB,EAAE,IAAI;YACtB,kBAAkB,EAAE,IAAI;YACxB,UAAU,EAAE,sBAAsB;YAClC,GAAG,CAAC,MAAM,CAAC,YAAY;gBACrB,CAAC,CAAC,EAAE,aAAa,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,YAAY,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE;gBACrE,CAAC,CAAC,EAAE,CAAC;SACR;KACF,CAAC,EACJ,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,YAAY,CAAC,CAClE,CAAA;IAED,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAiB,IAAI,CAAC,CAAA;IAC5D,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;IAC5C,MAAM,CAAC,WAAW,EAAE,mBAAmB,CAAC,GAAG,QAAQ,CAAgB,GAAG,EAAE;QACtE,IAAI,OAAO,MAAM,KAAK,WAAW;YAAE,OAAO,IAAI,CAAA;QAC9C,OAAO,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAA;IAC5D,CAAC,CAAC,CAAA;IAEF,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;IACjC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,WAAW,CAAC,OAAO;YAAE,OAAM;QAC/B,WAAW,CAAC,OAAO,GAAG,IAAI,CAAA;QAE1B,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE;YAC3C,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YACxB,UAAU,CAAC,KAAK,CAAC,CAAA;QACnB,CAAC,CAAC,CAAA;QAEF,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE;YACpF,UAAU,CAAC,UAAU,CAAC,CAAA;QACxB,CAAC,CAAC,CAAA;QAEF,OAAO,GAAG,EAAE;YACV,YAAY,CAAC,YAAY,CAAC,WAAW,EAAE,CAAA;QACzC,CAAC,CAAA;IACH,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAA;IAEd,MAAM,cAAc,GAAG,CAAC,KAAoB,EAAE,EAAE;QAC9C,mBAAmB,CAAC,KAAK,CAAC,CAAA;QAC1B,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;YAClC,IAAI,KAAK;gBAAE,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAA;;gBAChE,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,sBAAsB,CAAC,CAAA;QAC7D,CAAC;IACH,CAAC,CAAA;IAED,MAAM,KAAK,GAA0B;QACnC,MAAM;QACN,QAAQ;QACR,OAAO;QACP,OAAO;QACP,WAAW;QACX,cAAc;KACf,CAAA;IAED,OAAO,KAAC,gBAAgB,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,YAAG,QAAQ,GAA6B,CAAA;AACxF,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,MAAM,GAAG,GAAG,UAAU,CAAC,gBAAgB,CAAC,CAAA;IACxC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAA;IAC7E,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC"}
@@ -0,0 +1,25 @@
1
+ import type { Subscription } from './types.js';
2
+ export interface UseSubscriptionResult {
3
+ subscription: Subscription | null;
4
+ loading: boolean;
5
+ error: Error | null;
6
+ /** Refetch the row (e.g. after a Stripe webhook fires). */
7
+ refresh: () => void;
8
+ }
9
+ /**
10
+ * The active org's subscription row — tier, status, seat count, credits.
11
+ * Single source of truth across products: Ergo reads the same `credits`
12
+ * value the central app's billing screen will write.
13
+ *
14
+ * const { subscription } = useSubscription()
15
+ * if (subscription?.credits === 0) <BuyCreditsBanner />
16
+ */
17
+ export declare function useSubscription(): UseSubscriptionResult;
18
+ export interface UseCreditsResult {
19
+ credits: number | null;
20
+ loading: boolean;
21
+ refresh: () => void;
22
+ }
23
+ /** Convenience wrapper for components that only care about the credit count. */
24
+ export declare function useCredits(): UseCreditsResult;
25
+ //# sourceMappingURL=subscription.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subscription.d.ts","sourceRoot":"","sources":["../src/subscription.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAE9C,MAAM,WAAW,qBAAqB;IACpC,YAAY,EAAE,YAAY,GAAG,IAAI,CAAA;IACjC,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAA;IACnB,2DAA2D;IAC3D,OAAO,EAAE,MAAM,IAAI,CAAA;CACpB;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,IAAI,qBAAqB,CA2CvD;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,EAAE,MAAM,IAAI,CAAA;CACpB;AAED,gFAAgF;AAChF,wBAAgB,UAAU,IAAI,gBAAgB,CAO7C"}
@@ -0,0 +1,62 @@
1
+ 'use client';
2
+ import { useEffect, useState, useCallback } from 'react';
3
+ import { useUniversal } from './provider.js';
4
+ import { useOrg } from './auth.js';
5
+ /**
6
+ * The active org's subscription row — tier, status, seat count, credits.
7
+ * Single source of truth across products: Ergo reads the same `credits`
8
+ * value the central app's billing screen will write.
9
+ *
10
+ * const { subscription } = useSubscription()
11
+ * if (subscription?.credits === 0) <BuyCreditsBanner />
12
+ */
13
+ export function useSubscription() {
14
+ const { supabase } = useUniversal();
15
+ const { org } = useOrg();
16
+ const [subscription, setSubscription] = useState(null);
17
+ const [loading, setLoading] = useState(true);
18
+ const [error, setError] = useState(null);
19
+ const [reloadKey, setReloadKey] = useState(0);
20
+ useEffect(() => {
21
+ if (!org) {
22
+ setSubscription(null);
23
+ setLoading(false);
24
+ return;
25
+ }
26
+ let cancelled = false;
27
+ setLoading(true);
28
+ setError(null);
29
+ supabase
30
+ .from('subscriptions')
31
+ .select('org_id, tier, status, seat_count, current_period_end, credits')
32
+ .eq('org_id', org.id)
33
+ .maybeSingle()
34
+ .then(({ data, error: err }) => {
35
+ if (cancelled)
36
+ return;
37
+ if (err) {
38
+ setError(err);
39
+ setSubscription(null);
40
+ }
41
+ else {
42
+ setSubscription(data);
43
+ }
44
+ setLoading(false);
45
+ });
46
+ return () => {
47
+ cancelled = true;
48
+ };
49
+ }, [supabase, org, reloadKey]);
50
+ const refresh = useCallback(() => setReloadKey((k) => k + 1), []);
51
+ return { subscription, loading, error, refresh };
52
+ }
53
+ /** Convenience wrapper for components that only care about the credit count. */
54
+ export function useCredits() {
55
+ const { subscription, loading, refresh } = useSubscription();
56
+ return {
57
+ credits: subscription?.credits ?? null,
58
+ loading,
59
+ refresh,
60
+ };
61
+ }
62
+ //# sourceMappingURL=subscription.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subscription.js","sourceRoot":"","sources":["../src/subscription.ts"],"names":[],"mappings":"AAAA,YAAY,CAAA;AAEZ,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,OAAO,CAAA;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAWlC;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe;IAC7B,MAAM,EAAE,QAAQ,EAAE,GAAG,YAAY,EAAE,CAAA;IACnC,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,EAAE,CAAA;IACxB,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAsB,IAAI,CAAC,CAAA;IAC3E,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;IAC5C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAe,IAAI,CAAC,CAAA;IACtD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;IAE7C,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,eAAe,CAAC,IAAI,CAAC,CAAA;YACrB,UAAU,CAAC,KAAK,CAAC,CAAA;YACjB,OAAM;QACR,CAAC;QAED,IAAI,SAAS,GAAG,KAAK,CAAA;QACrB,UAAU,CAAC,IAAI,CAAC,CAAA;QAChB,QAAQ,CAAC,IAAI,CAAC,CAAA;QAEd,QAAQ;aACL,IAAI,CAAC,eAAe,CAAC;aACrB,MAAM,CAAC,+DAA+D,CAAC;aACvE,EAAE,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE,CAAC;aACpB,WAAW,EAAE;aACb,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE;YAC7B,IAAI,SAAS;gBAAE,OAAM;YACrB,IAAI,GAAG,EAAE,CAAC;gBACR,QAAQ,CAAC,GAAuB,CAAC,CAAA;gBACjC,eAAe,CAAC,IAAI,CAAC,CAAA;YACvB,CAAC;iBAAM,CAAC;gBACN,eAAe,CAAC,IAA2B,CAAC,CAAA;YAC9C,CAAC;YACD,UAAU,CAAC,KAAK,CAAC,CAAA;QACnB,CAAC,CAAC,CAAA;QAEJ,OAAO,GAAG,EAAE;YACV,SAAS,GAAG,IAAI,CAAA;QAClB,CAAC,CAAA;IACH,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC,CAAA;IAE9B,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;IAEjE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAA;AAClD,CAAC;AAQD,gFAAgF;AAChF,MAAM,UAAU,UAAU;IACxB,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,eAAe,EAAE,CAAA;IAC5D,OAAO;QACL,OAAO,EAAE,YAAY,EAAE,OAAO,IAAI,IAAI;QACtC,OAAO;QACP,OAAO;KACR,CAAA;AACH,CAAC"}
@@ -0,0 +1,29 @@
1
+ export interface TrialMode {
2
+ /** True while the visitor's session is anonymous-auth — i.e. they haven't
3
+ * signed up yet. Use this to gate exports, sharing, and multi-user
4
+ * features that don't make sense for a guest. */
5
+ isTrial: boolean;
6
+ /** False when there's no session at all (still loading, signed out). */
7
+ hasSession: boolean;
8
+ /** Email of the signed-in user, or null. */
9
+ email: string | null;
10
+ }
11
+ /**
12
+ * One-stop shop for "is this visitor a trial / guest?" — backed by Supabase's
13
+ * is_anonymous JWT claim, which flips to false the moment the user upgrades
14
+ * via supabase.auth.updateUser({email, password}).
15
+ *
16
+ * Typical usage in a product:
17
+ *
18
+ * const { isTrial } = useTrialMode()
19
+ * <Button onClick={exportPdf} disabled={isTrial}>
20
+ * Export {isTrial && <TrialBadge />}
21
+ * </Button>
22
+ *
23
+ * Or wrap a whole feature:
24
+ * const { isTrial } = useTrialMode()
25
+ * if (isTrial) return <UpgradeWall feature="invite teammates" />
26
+ * return <InviteForm />
27
+ */
28
+ export declare function useTrialMode(): TrialMode;
29
+ //# sourceMappingURL=trial.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trial.d.ts","sourceRoot":"","sources":["../src/trial.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,SAAS;IACxB;;sDAEkD;IAClD,OAAO,EAAE,OAAO,CAAA;IAChB,wEAAwE;IACxE,UAAU,EAAE,OAAO,CAAA;IACnB,4CAA4C;IAC5C,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CACrB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,YAAY,IAAI,SAAS,CAWxC"}