@appgram/react 0.1.1 → 0.1.4

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 (39) hide show
  1. package/dist/{useVote-CLhkwtLT.d.mts → StatusBoard-DZWI3zGJ.d.mts} +126 -1
  2. package/dist/{useVote-CLhkwtLT.d.ts → StatusBoard-DZWI3zGJ.d.ts} +126 -1
  3. package/dist/{chunk-N6PJDQCU.mjs → chunk-NABMGLTY.mjs} +210 -6
  4. package/dist/chunk-NABMGLTY.mjs.map +1 -0
  5. package/dist/chunk-NSV6Q6QQ.js +202 -0
  6. package/dist/chunk-NSV6Q6QQ.js.map +1 -0
  7. package/dist/chunk-ONZ7RQBM.mjs +199 -0
  8. package/dist/chunk-ONZ7RQBM.mjs.map +1 -0
  9. package/dist/{chunk-75P634IK.js → chunk-UPTP7QX5.js} +213 -5
  10. package/dist/chunk-UPTP7QX5.js.map +1 -0
  11. package/dist/{chunk-AIDLOCVJ.mjs → chunk-UWIJR4ZY.mjs} +760 -15
  12. package/dist/chunk-UWIJR4ZY.mjs.map +1 -0
  13. package/dist/{chunk-3UBJGXCO.js → chunk-WZIN7KEM.js} +820 -74
  14. package/dist/chunk-WZIN7KEM.js.map +1 -0
  15. package/dist/components/index.d.mts +68 -106
  16. package/dist/components/index.d.ts +68 -106
  17. package/dist/components/index.js +29 -21
  18. package/dist/components/index.mjs +2 -2
  19. package/dist/hooks/index.d.mts +3 -572
  20. package/dist/hooks/index.d.ts +3 -572
  21. package/dist/hooks/index.js +33 -13
  22. package/dist/hooks/index.mjs +2 -2
  23. package/dist/index-C_IqzaBU.d.mts +917 -0
  24. package/dist/index-h4Nbq4LC.d.ts +917 -0
  25. package/dist/index.d.mts +32 -5
  26. package/dist/index.d.ts +32 -5
  27. package/dist/index.js +124 -76
  28. package/dist/index.js.map +1 -1
  29. package/dist/index.mjs +61 -41
  30. package/dist/index.mjs.map +1 -1
  31. package/package.json +1 -1
  32. package/dist/chunk-3UBJGXCO.js.map +0 -1
  33. package/dist/chunk-75P634IK.js.map +0 -1
  34. package/dist/chunk-AIDLOCVJ.mjs.map +0 -1
  35. package/dist/chunk-KPIKYXAN.mjs +0 -47
  36. package/dist/chunk-KPIKYXAN.mjs.map +0 -1
  37. package/dist/chunk-N6PJDQCU.mjs.map +0 -1
  38. package/dist/chunk-ZJZ3A2S3.js +0 -49
  39. package/dist/chunk-ZJZ3A2S3.js.map +0 -1
@@ -1,3 +1,5 @@
1
+ import React from 'react';
2
+
1
3
  /**
2
4
  * Wish (Feature Request) Types
3
5
  */
@@ -300,6 +302,7 @@ interface SupportRequestInput {
300
302
  description: string;
301
303
  user_email: string;
302
304
  user_name?: string;
305
+ external_user_id?: string;
303
306
  category?: SupportRequestCategory;
304
307
  attachments?: File[];
305
308
  }
@@ -417,4 +420,126 @@ interface UseVoteResult {
417
420
  }
418
421
  declare function useVote(options: UseVoteOptions): UseVoteResult;
419
422
 
420
- export { type ArticleType as A, type WishPriority as B, type CommentsResponse as C, type WishStatus as D, useVote as E, type FlowDisplayType as F, type HelpCollection as H, type RoadmapData as R, type SupportRequestInput as S, type UseVoteOptions as U, type WishFilters as W, type WishesResponse as a, type Wish as b, type Comment as c, type Release as d, type ReleaseFeature as e, type HelpFlow as f, type HelpArticle as g, type SupportRequest as h, type Category as i, type CommentAuthor as j, type CommentCreateInput as k, type HelpArticlesResponse as l, type HelpCenterData as m, type ReleasesResponse as n, type Roadmap as o, type RoadmapColumn as p, type RoadmapItem as q, type RoadmapVisibility as r, type SupportAttachment as s, type SupportMessage as t, type SupportRequestCategory as u, type SupportRequestPriority as v, type SupportRequestStatus as w, type SupportRequestsResponse as x, type UseVoteResult as y, type WishAuthor as z };
423
+ /**
424
+ * StatusBoard Component
425
+ *
426
+ * Modern system status page with service health indicators and incident tracking.
427
+ * Adapted from StatusModern variant.
428
+ *
429
+ * @example
430
+ * ```tsx
431
+ * import { StatusBoard } from '@appgram/react'
432
+ *
433
+ * <StatusBoard
434
+ * heading="System Status"
435
+ * description="Current operational status of all services"
436
+ * status={statusData}
437
+ * onIncidentClick={(incident) => openIncidentDetail(incident.id)}
438
+ * />
439
+ * ```
440
+ *
441
+ * @example
442
+ * ```tsx
443
+ * // With custom component rendering
444
+ * <StatusBoard
445
+ * status={statusData}
446
+ * renderComponent={(component) => (
447
+ * <div className="custom-card">
448
+ * <Icon name={component.status} />
449
+ * <span>{component.name}</span>
450
+ * </div>
451
+ * )}
452
+ * />
453
+ * ```
454
+ */
455
+
456
+ type OverallStatus = 'operational' | 'degraded' | 'partial_outage' | 'major_outage';
457
+ type ComponentStatus = 'operational' | 'degraded' | 'partial_outage' | 'major_outage';
458
+ type IncidentStatus = 'investigating' | 'identified' | 'monitoring' | 'resolved';
459
+ type IncidentImpact = 'minor' | 'major' | 'critical';
460
+ interface StatusComponent {
461
+ id: string;
462
+ name: string;
463
+ description?: string;
464
+ status: ComponentStatus;
465
+ group?: string;
466
+ }
467
+ interface IncidentUpdate {
468
+ id: string;
469
+ message: string;
470
+ status: IncidentStatus;
471
+ created_at: string;
472
+ }
473
+ interface StatusIncident {
474
+ id: string;
475
+ title: string;
476
+ status: IncidentStatus;
477
+ impact: IncidentImpact;
478
+ created_at: string;
479
+ resolved_at?: string | null;
480
+ updates: IncidentUpdate[];
481
+ affected_components?: string[];
482
+ }
483
+ interface StatusData {
484
+ overall_status: OverallStatus;
485
+ components: StatusComponent[];
486
+ incidents: StatusIncident[];
487
+ last_updated?: string;
488
+ }
489
+ interface StatusBoardProps {
490
+ /**
491
+ * Status data to display
492
+ */
493
+ status: StatusData;
494
+ /**
495
+ * Page heading
496
+ */
497
+ heading?: string;
498
+ /**
499
+ * Page description
500
+ */
501
+ description?: string;
502
+ /**
503
+ * Heading alignment
504
+ * @default 'left'
505
+ */
506
+ headingAlignment?: 'left' | 'center' | 'right';
507
+ /**
508
+ * Show component descriptions
509
+ * @default true
510
+ */
511
+ showComponentDescriptions?: boolean;
512
+ /**
513
+ * Show incident history
514
+ * @default true
515
+ */
516
+ showIncidentHistory?: boolean;
517
+ /**
518
+ * Max number of past incidents to show
519
+ * @default 5
520
+ */
521
+ maxPastIncidents?: number;
522
+ /**
523
+ * Click handler for incidents
524
+ */
525
+ onIncidentClick?: (incident: StatusIncident) => void;
526
+ /**
527
+ * Custom render for overall status
528
+ */
529
+ renderOverallStatus?: (status: OverallStatus) => React.ReactNode;
530
+ /**
531
+ * Custom render for component
532
+ */
533
+ renderComponent?: (component: StatusComponent) => React.ReactNode;
534
+ /**
535
+ * Custom render for incident
536
+ */
537
+ renderIncident?: (incident: StatusIncident) => React.ReactNode;
538
+ /**
539
+ * Custom class name
540
+ */
541
+ className?: string;
542
+ }
543
+ declare function StatusBoard({ status, heading, description, headingAlignment, showComponentDescriptions, showIncidentHistory, maxPastIncidents, onIncidentClick, renderOverallStatus, renderComponent, renderIncident, className, }: StatusBoardProps): React.ReactElement;
544
+
545
+ export { type ArticleType as A, type SupportAttachment as B, type CommentsResponse as C, type SupportMessage as D, type SupportRequestCategory as E, type FlowDisplayType as F, type SupportRequestPriority as G, type HelpCollection as H, type IncidentImpact as I, type SupportRequestStatus as J, type SupportRequestsResponse as K, type UseVoteResult as L, type WishAuthor as M, type WishPriority as N, type OverallStatus as O, type WishStatus as P, useVote as Q, type RoadmapData as R, type SupportRequestInput as S, type UseVoteOptions as U, type WishFilters as W, type WishesResponse as a, type Wish as b, type Comment as c, type Release as d, type ReleaseFeature as e, type HelpFlow as f, type HelpArticle as g, type SupportRequest as h, type Category as i, type CommentAuthor as j, type CommentCreateInput as k, type ComponentStatus as l, type HelpArticlesResponse as m, type HelpCenterData as n, type IncidentStatus as o, type IncidentUpdate as p, type ReleasesResponse as q, type Roadmap as r, type RoadmapColumn as s, type RoadmapItem as t, type RoadmapVisibility as u, StatusBoard as v, type StatusBoardProps as w, type StatusComponent as x, type StatusData as y, type StatusIncident as z };
@@ -1,3 +1,5 @@
1
+ import React from 'react';
2
+
1
3
  /**
2
4
  * Wish (Feature Request) Types
3
5
  */
@@ -300,6 +302,7 @@ interface SupportRequestInput {
300
302
  description: string;
301
303
  user_email: string;
302
304
  user_name?: string;
305
+ external_user_id?: string;
303
306
  category?: SupportRequestCategory;
304
307
  attachments?: File[];
305
308
  }
@@ -417,4 +420,126 @@ interface UseVoteResult {
417
420
  }
418
421
  declare function useVote(options: UseVoteOptions): UseVoteResult;
419
422
 
420
- export { type ArticleType as A, type WishPriority as B, type CommentsResponse as C, type WishStatus as D, useVote as E, type FlowDisplayType as F, type HelpCollection as H, type RoadmapData as R, type SupportRequestInput as S, type UseVoteOptions as U, type WishFilters as W, type WishesResponse as a, type Wish as b, type Comment as c, type Release as d, type ReleaseFeature as e, type HelpFlow as f, type HelpArticle as g, type SupportRequest as h, type Category as i, type CommentAuthor as j, type CommentCreateInput as k, type HelpArticlesResponse as l, type HelpCenterData as m, type ReleasesResponse as n, type Roadmap as o, type RoadmapColumn as p, type RoadmapItem as q, type RoadmapVisibility as r, type SupportAttachment as s, type SupportMessage as t, type SupportRequestCategory as u, type SupportRequestPriority as v, type SupportRequestStatus as w, type SupportRequestsResponse as x, type UseVoteResult as y, type WishAuthor as z };
423
+ /**
424
+ * StatusBoard Component
425
+ *
426
+ * Modern system status page with service health indicators and incident tracking.
427
+ * Adapted from StatusModern variant.
428
+ *
429
+ * @example
430
+ * ```tsx
431
+ * import { StatusBoard } from '@appgram/react'
432
+ *
433
+ * <StatusBoard
434
+ * heading="System Status"
435
+ * description="Current operational status of all services"
436
+ * status={statusData}
437
+ * onIncidentClick={(incident) => openIncidentDetail(incident.id)}
438
+ * />
439
+ * ```
440
+ *
441
+ * @example
442
+ * ```tsx
443
+ * // With custom component rendering
444
+ * <StatusBoard
445
+ * status={statusData}
446
+ * renderComponent={(component) => (
447
+ * <div className="custom-card">
448
+ * <Icon name={component.status} />
449
+ * <span>{component.name}</span>
450
+ * </div>
451
+ * )}
452
+ * />
453
+ * ```
454
+ */
455
+
456
+ type OverallStatus = 'operational' | 'degraded' | 'partial_outage' | 'major_outage';
457
+ type ComponentStatus = 'operational' | 'degraded' | 'partial_outage' | 'major_outage';
458
+ type IncidentStatus = 'investigating' | 'identified' | 'monitoring' | 'resolved';
459
+ type IncidentImpact = 'minor' | 'major' | 'critical';
460
+ interface StatusComponent {
461
+ id: string;
462
+ name: string;
463
+ description?: string;
464
+ status: ComponentStatus;
465
+ group?: string;
466
+ }
467
+ interface IncidentUpdate {
468
+ id: string;
469
+ message: string;
470
+ status: IncidentStatus;
471
+ created_at: string;
472
+ }
473
+ interface StatusIncident {
474
+ id: string;
475
+ title: string;
476
+ status: IncidentStatus;
477
+ impact: IncidentImpact;
478
+ created_at: string;
479
+ resolved_at?: string | null;
480
+ updates: IncidentUpdate[];
481
+ affected_components?: string[];
482
+ }
483
+ interface StatusData {
484
+ overall_status: OverallStatus;
485
+ components: StatusComponent[];
486
+ incidents: StatusIncident[];
487
+ last_updated?: string;
488
+ }
489
+ interface StatusBoardProps {
490
+ /**
491
+ * Status data to display
492
+ */
493
+ status: StatusData;
494
+ /**
495
+ * Page heading
496
+ */
497
+ heading?: string;
498
+ /**
499
+ * Page description
500
+ */
501
+ description?: string;
502
+ /**
503
+ * Heading alignment
504
+ * @default 'left'
505
+ */
506
+ headingAlignment?: 'left' | 'center' | 'right';
507
+ /**
508
+ * Show component descriptions
509
+ * @default true
510
+ */
511
+ showComponentDescriptions?: boolean;
512
+ /**
513
+ * Show incident history
514
+ * @default true
515
+ */
516
+ showIncidentHistory?: boolean;
517
+ /**
518
+ * Max number of past incidents to show
519
+ * @default 5
520
+ */
521
+ maxPastIncidents?: number;
522
+ /**
523
+ * Click handler for incidents
524
+ */
525
+ onIncidentClick?: (incident: StatusIncident) => void;
526
+ /**
527
+ * Custom render for overall status
528
+ */
529
+ renderOverallStatus?: (status: OverallStatus) => React.ReactNode;
530
+ /**
531
+ * Custom render for component
532
+ */
533
+ renderComponent?: (component: StatusComponent) => React.ReactNode;
534
+ /**
535
+ * Custom render for incident
536
+ */
537
+ renderIncident?: (incident: StatusIncident) => React.ReactNode;
538
+ /**
539
+ * Custom class name
540
+ */
541
+ className?: string;
542
+ }
543
+ declare function StatusBoard({ status, heading, description, headingAlignment, showComponentDescriptions, showIncidentHistory, maxPastIncidents, onIncidentClick, renderOverallStatus, renderComponent, renderIncident, className, }: StatusBoardProps): React.ReactElement;
544
+
545
+ export { type ArticleType as A, type SupportAttachment as B, type CommentsResponse as C, type SupportMessage as D, type SupportRequestCategory as E, type FlowDisplayType as F, type SupportRequestPriority as G, type HelpCollection as H, type IncidentImpact as I, type SupportRequestStatus as J, type SupportRequestsResponse as K, type UseVoteResult as L, type WishAuthor as M, type WishPriority as N, type OverallStatus as O, type WishStatus as P, useVote as Q, type RoadmapData as R, type SupportRequestInput as S, type UseVoteOptions as U, type WishFilters as W, type WishesResponse as a, type Wish as b, type Comment as c, type Release as d, type ReleaseFeature as e, type HelpFlow as f, type HelpArticle as g, type SupportRequest as h, type Category as i, type CommentAuthor as j, type CommentCreateInput as k, type ComponentStatus as l, type HelpArticlesResponse as m, type HelpCenterData as n, type IncidentStatus as o, type IncidentUpdate as p, type ReleasesResponse as q, type Roadmap as r, type RoadmapColumn as s, type RoadmapItem as t, type RoadmapVisibility as u, StatusBoard as v, type StatusBoardProps as w, type StatusComponent as x, type StatusData as y, type StatusIncident as z };
@@ -44,9 +44,7 @@ function getBrowserCharacteristics() {
44
44
  function generateFingerprint() {
45
45
  const characteristics = getBrowserCharacteristics();
46
46
  const timestamp = Date.now().toString(36);
47
- const randomBytes = new Uint8Array(6);
48
- crypto.getRandomValues(randomBytes);
49
- const random = Array.from(randomBytes, (b) => b.toString(36)).join("").substring(0, 10);
47
+ const random = Math.random().toString(36).substring(2, 10);
50
48
  return `${simpleHash(characteristics)}-${timestamp}-${random}`;
51
49
  }
52
50
  function getFingerprint() {
@@ -735,7 +733,213 @@ function useSupport(options = {}) {
735
733
  clearMessages
736
734
  };
737
735
  }
736
+ function useSurvey(slug, options = {}) {
737
+ const { enabled = true } = options;
738
+ const { client } = useAppgramContext();
739
+ const [survey, setSurvey] = useState(null);
740
+ const [nodes, setNodes] = useState([]);
741
+ const [isLoading, setIsLoading] = useState(false);
742
+ const [error, setError] = useState(null);
743
+ const fetchSurvey = useCallback(async () => {
744
+ if (!slug) return;
745
+ setIsLoading(true);
746
+ setError(null);
747
+ try {
748
+ const response = await client.getPublicSurvey(slug);
749
+ if (response.success && response.data) {
750
+ const { nodes: surveyNodes, ...surveyData } = response.data;
751
+ setSurvey(surveyData);
752
+ setNodes(surveyNodes || []);
753
+ } else {
754
+ setError(getErrorMessage(response.error, "Failed to fetch survey"));
755
+ }
756
+ } catch (err) {
757
+ setError(getErrorMessage(err, "An error occurred"));
758
+ } finally {
759
+ setIsLoading(false);
760
+ }
761
+ }, [client, slug]);
762
+ useEffect(() => {
763
+ if (enabled) {
764
+ fetchSurvey();
765
+ }
766
+ }, [enabled, fetchSurvey]);
767
+ return {
768
+ survey,
769
+ nodes,
770
+ isLoading,
771
+ error,
772
+ refetch: fetchSurvey
773
+ };
774
+ }
775
+ function useSurveySubmit(options = {}) {
776
+ const { client } = useAppgramContext();
777
+ const [isSubmitting, setIsSubmitting] = useState(false);
778
+ const [error, setError] = useState(null);
779
+ const [successMessage, setSuccessMessage] = useState(null);
780
+ const clearMessages = useCallback(() => {
781
+ setError(null);
782
+ setSuccessMessage(null);
783
+ }, []);
784
+ const submitResponse = useCallback(
785
+ async (surveyId, data) => {
786
+ setIsSubmitting(true);
787
+ setError(null);
788
+ setSuccessMessage(null);
789
+ try {
790
+ const response = await client.submitSurveyResponse(surveyId, data);
791
+ if (response.success && response.data) {
792
+ setSuccessMessage("Survey response submitted successfully.");
793
+ options.onSuccess?.(response.data);
794
+ return response.data;
795
+ } else {
796
+ const errorMsg = getErrorMessage(response.error, "Failed to submit survey response");
797
+ setError(errorMsg);
798
+ options.onError?.(errorMsg);
799
+ return null;
800
+ }
801
+ } catch (err) {
802
+ const errorMsg = getErrorMessage(err, "An error occurred");
803
+ setError(errorMsg);
804
+ options.onError?.(errorMsg);
805
+ return null;
806
+ } finally {
807
+ setIsSubmitting(false);
808
+ }
809
+ },
810
+ [client, options]
811
+ );
812
+ return {
813
+ isSubmitting,
814
+ error,
815
+ successMessage,
816
+ submitResponse,
817
+ clearMessages
818
+ };
819
+ }
820
+ function useContactForm(formId, options = {}) {
821
+ const { enabled = true } = options;
822
+ const { client } = useAppgramContext();
823
+ const [form, setForm] = useState(null);
824
+ const [isLoading, setIsLoading] = useState(false);
825
+ const [error, setError] = useState(null);
826
+ const fetchForm = useCallback(async () => {
827
+ if (!formId) return;
828
+ setIsLoading(true);
829
+ setError(null);
830
+ try {
831
+ const response = await client.getPublicForm(formId);
832
+ if (response.success && response.data) {
833
+ setForm(response.data);
834
+ } else {
835
+ setError(getErrorMessage(response.error, "Failed to fetch form"));
836
+ }
837
+ } catch (err) {
838
+ setError(getErrorMessage(err, "An error occurred"));
839
+ } finally {
840
+ setIsLoading(false);
841
+ }
842
+ }, [client, formId]);
843
+ useEffect(() => {
844
+ if (enabled) {
845
+ fetchForm();
846
+ }
847
+ }, [enabled, fetchForm]);
848
+ return {
849
+ form,
850
+ isLoading,
851
+ error,
852
+ refetch: fetchForm
853
+ };
854
+ }
855
+ function useContactFormSubmit(options = {}) {
856
+ const { rateLimitMs = 5e3 } = options;
857
+ const { client } = useAppgramContext();
858
+ const [isSubmitting, setIsSubmitting] = useState(false);
859
+ const [error, setError] = useState(null);
860
+ const [successMessage, setSuccessMessage] = useState(null);
861
+ const [isRateLimited, setIsRateLimited] = useState(false);
862
+ const lastSubmitRef = useRef(0);
863
+ const clearMessages = useCallback(() => {
864
+ setError(null);
865
+ setSuccessMessage(null);
866
+ }, []);
867
+ const validateField = useCallback(
868
+ (value, field) => {
869
+ if (field.required && !value.trim()) {
870
+ return "This field is required";
871
+ }
872
+ if (field.type === "email" && value) {
873
+ const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
874
+ if (!emailRegex.test(value)) {
875
+ return "Please enter a valid email address";
876
+ }
877
+ }
878
+ if (field.validation) {
879
+ if (field.validation.minLength && value.length < field.validation.minLength) {
880
+ return `Must be at least ${field.validation.minLength} characters`;
881
+ }
882
+ if (field.validation.maxLength && value.length > field.validation.maxLength) {
883
+ return `Must be no more than ${field.validation.maxLength} characters`;
884
+ }
885
+ if (field.validation.pattern) {
886
+ const regex = new RegExp(field.validation.pattern);
887
+ if (!regex.test(value)) {
888
+ return "Invalid format";
889
+ }
890
+ }
891
+ }
892
+ return null;
893
+ },
894
+ []
895
+ );
896
+ const submitForm = useCallback(
897
+ async (projectId, formId, data) => {
898
+ const now = Date.now();
899
+ if (now - lastSubmitRef.current < rateLimitMs) {
900
+ setIsRateLimited(true);
901
+ setError("Please wait before submitting again.");
902
+ setTimeout(() => setIsRateLimited(false), rateLimitMs - (now - lastSubmitRef.current));
903
+ return null;
904
+ }
905
+ setIsSubmitting(true);
906
+ setError(null);
907
+ setSuccessMessage(null);
908
+ try {
909
+ const response = await client.submitContactForm(projectId, formId, data);
910
+ if (response.success && response.data) {
911
+ lastSubmitRef.current = Date.now();
912
+ setSuccessMessage("Form submitted successfully.");
913
+ options.onSuccess?.(response.data);
914
+ return response.data;
915
+ } else {
916
+ const errorMsg = getErrorMessage(response.error, "Failed to submit form");
917
+ setError(errorMsg);
918
+ options.onError?.(errorMsg);
919
+ return null;
920
+ }
921
+ } catch (err) {
922
+ const errorMsg = getErrorMessage(err, "An error occurred");
923
+ setError(errorMsg);
924
+ options.onError?.(errorMsg);
925
+ return null;
926
+ } finally {
927
+ setIsSubmitting(false);
928
+ }
929
+ },
930
+ [client, options, rateLimitMs]
931
+ );
932
+ return {
933
+ isSubmitting,
934
+ error,
935
+ successMessage,
936
+ isRateLimited,
937
+ submitForm,
938
+ validateField,
939
+ clearMessages
940
+ };
941
+ }
738
942
 
739
- export { AppgramContext, cn, getErrorMessage, getFingerprint, resetFingerprint, useAppgramContext, useComments, useHelpArticle, useHelpCenter, useHelpFlow, useRelease, useReleases, useRoadmap, useSupport, useVote, useWishes };
740
- //# sourceMappingURL=chunk-N6PJDQCU.mjs.map
741
- //# sourceMappingURL=chunk-N6PJDQCU.mjs.map
943
+ export { AppgramContext, cn, getErrorMessage, getFingerprint, resetFingerprint, useAppgramContext, useComments, useContactForm, useContactFormSubmit, useHelpArticle, useHelpCenter, useHelpFlow, useRelease, useReleases, useRoadmap, useSupport, useSurvey, useSurveySubmit, useVote, useWishes };
944
+ //# sourceMappingURL=chunk-NABMGLTY.mjs.map
945
+ //# sourceMappingURL=chunk-NABMGLTY.mjs.map