analytica-frontend-lib 1.1.18 → 1.1.19

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/index.mjs CHANGED
@@ -5903,10 +5903,67 @@ var IconRender = ({
5903
5903
  };
5904
5904
  var IconRender_default = IconRender;
5905
5905
 
5906
+ // src/hooks/useMobile.ts
5907
+ import { useState as useState12, useEffect as useEffect9 } from "react";
5908
+ var MOBILE_WIDTH = 500;
5909
+ var TABLET_WIDTH = 931;
5910
+ var DEFAULT_WIDTH = 1200;
5911
+ var getWindowWidth = () => {
5912
+ if (typeof window === "undefined") {
5913
+ return DEFAULT_WIDTH;
5914
+ }
5915
+ return window.innerWidth;
5916
+ };
5917
+ var getDeviceType = () => {
5918
+ const width = getWindowWidth();
5919
+ return width < TABLET_WIDTH ? "responsive" : "desktop";
5920
+ };
5921
+ var useMobile = () => {
5922
+ const [isMobile, setIsMobile] = useState12(false);
5923
+ const [isTablet, setIsTablet] = useState12(false);
5924
+ useEffect9(() => {
5925
+ const checkScreenSize = () => {
5926
+ const width = getWindowWidth();
5927
+ setIsMobile(width < MOBILE_WIDTH);
5928
+ setIsTablet(width < TABLET_WIDTH);
5929
+ };
5930
+ checkScreenSize();
5931
+ window.addEventListener("resize", checkScreenSize);
5932
+ return () => window.removeEventListener("resize", checkScreenSize);
5933
+ }, []);
5934
+ const getFormContainerClasses = () => {
5935
+ if (isMobile) {
5936
+ return "w-full px-4";
5937
+ }
5938
+ if (isTablet) {
5939
+ return "w-full px-6";
5940
+ }
5941
+ return "w-full max-w-[992px] mx-auto px-0";
5942
+ };
5943
+ const getMobileHeaderClasses = () => {
5944
+ return "flex flex-col items-start gap-4 mb-6";
5945
+ };
5946
+ const getDesktopHeaderClasses = () => {
5947
+ return "flex flex-row justify-between items-center gap-6 mb-8";
5948
+ };
5949
+ const getHeaderClasses = () => {
5950
+ return isMobile ? getMobileHeaderClasses() : getDesktopHeaderClasses();
5951
+ };
5952
+ return {
5953
+ isMobile,
5954
+ isTablet,
5955
+ getFormContainerClasses,
5956
+ getHeaderClasses,
5957
+ getMobileHeaderClasses,
5958
+ getDesktopHeaderClasses,
5959
+ getDeviceType
5960
+ };
5961
+ };
5962
+
5906
5963
  // src/components/Select/Select.tsx
5907
5964
  import { create as create5, useStore as useStore4 } from "zustand";
5908
5965
  import {
5909
- useEffect as useEffect9,
5966
+ useEffect as useEffect10,
5910
5967
  useRef as useRef7,
5911
5968
  forwardRef as forwardRef16,
5912
5969
  isValidElement as isValidElement4,
@@ -6037,13 +6094,13 @@ var Select = ({
6037
6094
  search(children2);
6038
6095
  return found;
6039
6096
  };
6040
- useEffect9(() => {
6097
+ useEffect10(() => {
6041
6098
  if (!selectedLabel && defaultValue) {
6042
6099
  const label2 = findLabelForValue(children, defaultValue);
6043
6100
  if (label2) store.setState({ selectedLabel: label2 });
6044
6101
  }
6045
6102
  }, [children, defaultValue, selectedLabel]);
6046
- useEffect9(() => {
6103
+ useEffect10(() => {
6047
6104
  const handleClickOutside = (event) => {
6048
6105
  if (selectRef.current && !selectRef.current.contains(event.target)) {
6049
6106
  setOpen(false);
@@ -6078,7 +6135,7 @@ var Select = ({
6078
6135
  document.removeEventListener("keydown", handleArrowKeys);
6079
6136
  };
6080
6137
  }, [open]);
6081
- useEffect9(() => {
6138
+ useEffect10(() => {
6082
6139
  if (propValue) {
6083
6140
  setValue(propValue);
6084
6141
  const label2 = findLabelForValue(children, propValue);
@@ -6261,13 +6318,13 @@ var Select_default = Select;
6261
6318
  // src/components/Menu/Menu.tsx
6262
6319
  import { create as create6, useStore as useStore5 } from "zustand";
6263
6320
  import {
6264
- useEffect as useEffect10,
6321
+ useEffect as useEffect11,
6265
6322
  useRef as useRef8,
6266
6323
  forwardRef as forwardRef17,
6267
6324
  isValidElement as isValidElement5,
6268
6325
  Children as Children5,
6269
6326
  cloneElement as cloneElement5,
6270
- useState as useState12
6327
+ useState as useState13
6271
6328
  } from "react";
6272
6329
  import { CaretLeft as CaretLeft2, CaretRight as CaretRight3 } from "phosphor-react";
6273
6330
  import { jsx as jsx33, jsxs as jsxs27 } from "react/jsx-runtime";
@@ -6302,7 +6359,7 @@ var Menu = forwardRef17(
6302
6359
  storeRef.current ??= createMenuStore(onValueChange);
6303
6360
  const store = storeRef.current;
6304
6361
  const { setValue } = useStore5(store, (s) => s);
6305
- useEffect10(() => {
6362
+ useEffect11(() => {
6306
6363
  setValue(propValue ?? defaultValue);
6307
6364
  }, [defaultValue, propValue, setValue]);
6308
6365
  const baseClasses = "w-full py-2 flex flex-row items-center justify-center";
@@ -6479,9 +6536,9 @@ var MenuOverflow = ({
6479
6536
  ...props
6480
6537
  }) => {
6481
6538
  const containerRef = useRef8(null);
6482
- const [showLeftArrow, setShowLeftArrow] = useState12(false);
6483
- const [showRightArrow, setShowRightArrow] = useState12(false);
6484
- useEffect10(() => {
6539
+ const [showLeftArrow, setShowLeftArrow] = useState13(false);
6540
+ const [showRightArrow, setShowRightArrow] = useState13(false);
6541
+ useEffect11(() => {
6485
6542
  const checkScroll = () => internalCheckScroll(
6486
6543
  containerRef.current,
6487
6544
  setShowLeftArrow,
@@ -6808,8 +6865,8 @@ var NotFound_default = NotFound;
6808
6865
  // src/components/VideoPlayer/VideoPlayer.tsx
6809
6866
  import {
6810
6867
  useRef as useRef9,
6811
- useState as useState13,
6812
- useEffect as useEffect11,
6868
+ useState as useState14,
6869
+ useEffect as useEffect12,
6813
6870
  useCallback
6814
6871
  } from "react";
6815
6872
  import {
@@ -6926,20 +6983,20 @@ var VideoPlayer = ({
6926
6983
  storageKey = "video-progress"
6927
6984
  }) => {
6928
6985
  const videoRef = useRef9(null);
6929
- const [isPlaying, setIsPlaying] = useState13(false);
6930
- const [currentTime, setCurrentTime] = useState13(0);
6931
- const [duration, setDuration] = useState13(0);
6932
- const [isMuted, setIsMuted] = useState13(false);
6933
- const [volume, setVolume] = useState13(1);
6934
- const [isFullscreen, setIsFullscreen] = useState13(false);
6935
- const [showControls, setShowControls] = useState13(true);
6936
- const [hasCompleted, setHasCompleted] = useState13(false);
6937
- const [showCaptions, setShowCaptions] = useState13(false);
6938
- useEffect11(() => {
6986
+ const [isPlaying, setIsPlaying] = useState14(false);
6987
+ const [currentTime, setCurrentTime] = useState14(0);
6988
+ const [duration, setDuration] = useState14(0);
6989
+ const [isMuted, setIsMuted] = useState14(false);
6990
+ const [volume, setVolume] = useState14(1);
6991
+ const [isFullscreen, setIsFullscreen] = useState14(false);
6992
+ const [showControls, setShowControls] = useState14(true);
6993
+ const [hasCompleted, setHasCompleted] = useState14(false);
6994
+ const [showCaptions, setShowCaptions] = useState14(false);
6995
+ useEffect12(() => {
6939
6996
  setHasCompleted(false);
6940
6997
  }, [src]);
6941
- const [playbackRate, setPlaybackRate] = useState13(1);
6942
- const [showSpeedMenu, setShowSpeedMenu] = useState13(false);
6998
+ const [playbackRate, setPlaybackRate] = useState14(1);
6999
+ const [showSpeedMenu, setShowSpeedMenu] = useState14(false);
6943
7000
  const lastSaveTimeRef = useRef9(0);
6944
7001
  const trackRef = useRef9(null);
6945
7002
  const controlsTimeoutRef = useRef9(null);
@@ -7007,13 +7064,13 @@ var VideoPlayer = ({
7007
7064
  }, LEAVE_HIDE_TIMEOUT);
7008
7065
  }
7009
7066
  }, [isFullscreen, clearControlsTimeout, isUserInteracting]);
7010
- useEffect11(() => {
7067
+ useEffect12(() => {
7011
7068
  if (videoRef.current) {
7012
7069
  videoRef.current.volume = volume;
7013
7070
  videoRef.current.muted = isMuted;
7014
7071
  }
7015
7072
  }, [volume, isMuted]);
7016
- useEffect11(() => {
7073
+ useEffect12(() => {
7017
7074
  const video = videoRef.current;
7018
7075
  if (!video) return;
7019
7076
  const onPlay = () => setIsPlaying(true);
@@ -7028,7 +7085,7 @@ var VideoPlayer = ({
7028
7085
  video.removeEventListener("ended", onEnded);
7029
7086
  };
7030
7087
  }, []);
7031
- useEffect11(() => {
7088
+ useEffect12(() => {
7032
7089
  if (isPlaying) {
7033
7090
  showControlsWithTimer();
7034
7091
  } else {
@@ -7040,7 +7097,7 @@ var VideoPlayer = ({
7040
7097
  }
7041
7098
  }
7042
7099
  }, [isPlaying, isFullscreen, showControlsWithTimer, clearControlsTimeout]);
7043
- useEffect11(() => {
7100
+ useEffect12(() => {
7044
7101
  const handleFullscreenChange = () => {
7045
7102
  const isCurrentlyFullscreen = !!document.fullscreenElement;
7046
7103
  setIsFullscreen(isCurrentlyFullscreen);
@@ -7053,7 +7110,7 @@ var VideoPlayer = ({
7053
7110
  document.removeEventListener("fullscreenchange", handleFullscreenChange);
7054
7111
  };
7055
7112
  }, [showControlsWithTimer]);
7056
- useEffect11(() => {
7113
+ useEffect12(() => {
7057
7114
  const init = () => {
7058
7115
  if (!isFullscreen) {
7059
7116
  showControlsWithTimer();
@@ -7086,7 +7143,7 @@ var VideoPlayer = ({
7086
7143
  if (hasValidSaved) return saved;
7087
7144
  return void 0;
7088
7145
  }, [autoSave, storageKey, src, initialTime]);
7089
- useEffect11(() => {
7146
+ useEffect12(() => {
7090
7147
  const start = getInitialTime();
7091
7148
  if (start !== void 0 && videoRef.current) {
7092
7149
  videoRef.current.currentTime = start;
@@ -7207,12 +7264,12 @@ var VideoPlayer = ({
7207
7264
  setDuration(videoRef.current.duration);
7208
7265
  }
7209
7266
  }, []);
7210
- useEffect11(() => {
7267
+ useEffect12(() => {
7211
7268
  if (trackRef.current?.track) {
7212
7269
  trackRef.current.track.mode = showCaptions && subtitles ? "showing" : "hidden";
7213
7270
  }
7214
7271
  }, [subtitles, showCaptions]);
7215
- useEffect11(() => {
7272
+ useEffect12(() => {
7216
7273
  const handleVisibilityChange = () => {
7217
7274
  if (document.hidden && isPlaying && videoRef.current) {
7218
7275
  videoRef.current.pause();
@@ -7465,7 +7522,7 @@ var VideoPlayer = ({
7465
7522
  var VideoPlayer_default = VideoPlayer;
7466
7523
 
7467
7524
  // src/components/Whiteboard/Whiteboard.tsx
7468
- import { useCallback as useCallback2, useState as useState14 } from "react";
7525
+ import { useCallback as useCallback2, useState as useState15 } from "react";
7469
7526
  import { DownloadSimple } from "phosphor-react";
7470
7527
  import { Fragment as Fragment7, jsx as jsx37, jsxs as jsxs31 } from "react/jsx-runtime";
7471
7528
  var IMAGE_WIDTH = 225;
@@ -7478,7 +7535,7 @@ var Whiteboard = ({
7478
7535
  imagesPerRow = 2,
7479
7536
  ...rest
7480
7537
  }) => {
7481
- const [imageErrors, setImageErrors] = useState14(/* @__PURE__ */ new Set());
7538
+ const [imageErrors, setImageErrors] = useState15(/* @__PURE__ */ new Set());
7482
7539
  const handleDownload = useCallback2(
7483
7540
  (image) => {
7484
7541
  if (onDownload) {
@@ -7586,8 +7643,8 @@ var Whiteboard_default = Whiteboard;
7586
7643
  import {
7587
7644
  createContext,
7588
7645
  useContext,
7589
- useEffect as useEffect12,
7590
- useState as useState15,
7646
+ useEffect as useEffect13,
7647
+ useState as useState16,
7591
7648
  useCallback as useCallback3,
7592
7649
  useMemo as useMemo4
7593
7650
  } from "react";
@@ -7603,7 +7660,7 @@ var AuthProvider = ({
7603
7660
  getSessionFn,
7604
7661
  getTokensFn
7605
7662
  }) => {
7606
- const [authState, setAuthState] = useState15({
7663
+ const [authState, setAuthState] = useState16({
7607
7664
  isAuthenticated: false,
7608
7665
  isLoading: true,
7609
7666
  ...initialAuthState
@@ -7651,7 +7708,7 @@ var AuthProvider = ({
7651
7708
  tokens: void 0
7652
7709
  }));
7653
7710
  }, [signOutFn]);
7654
- useEffect12(() => {
7711
+ useEffect13(() => {
7655
7712
  checkAuth();
7656
7713
  }, [checkAuth]);
7657
7714
  const contextValue = useMemo4(
@@ -7805,7 +7862,7 @@ function createZustandAuthAdapter(useAuthStore) {
7805
7862
  }
7806
7863
 
7807
7864
  // src/components/Auth/useUrlAuthentication.ts
7808
- import { useEffect as useEffect13 } from "react";
7865
+ import { useEffect as useEffect14 } from "react";
7809
7866
  import { useLocation as useLocation2 } from "react-router-dom";
7810
7867
  var getAuthParams = (location, extractParams) => {
7811
7868
  const searchParams = new URLSearchParams(location.search);
@@ -7853,7 +7910,7 @@ var handleUserData = (responseData, setUser) => {
7853
7910
  };
7854
7911
  function useUrlAuthentication(options) {
7855
7912
  const location = useLocation2();
7856
- useEffect13(() => {
7913
+ useEffect14(() => {
7857
7914
  const handleAuthentication = async () => {
7858
7915
  const authParams = getAuthParams(location, options.extractParams);
7859
7916
  if (!hasValidAuthParams(authParams)) {
@@ -7915,10 +7972,10 @@ import {
7915
7972
  } from "phosphor-react";
7916
7973
  import {
7917
7974
  forwardRef as forwardRef19,
7918
- useEffect as useEffect14,
7975
+ useEffect as useEffect15,
7919
7976
  useMemo as useMemo6,
7920
7977
  useId as useId10,
7921
- useState as useState16,
7978
+ useState as useState17,
7922
7979
  useCallback as useCallback4,
7923
7980
  useRef as useRef10
7924
7981
  } from "react";
@@ -8519,7 +8576,7 @@ var getStatusStyles = (variantCorrect) => {
8519
8576
  };
8520
8577
  var Quiz = forwardRef19(({ children, className, variant = "default", ...props }, ref) => {
8521
8578
  const { setVariant } = useQuizStore();
8522
- useEffect14(() => {
8579
+ useEffect15(() => {
8523
8580
  setVariant(variant);
8524
8581
  }, [variant, setVariant]);
8525
8582
  return /* @__PURE__ */ jsx39(
@@ -8538,8 +8595,8 @@ var Quiz = forwardRef19(({ children, className, variant = "default", ...props },
8538
8595
  var QuizHeaderResult = forwardRef19(
8539
8596
  ({ className, ...props }, ref) => {
8540
8597
  const { getQuestionResultByQuestionId, getCurrentQuestion } = useQuizStore();
8541
- const [isCorrect, setIsCorrect] = useState16(false);
8542
- useEffect14(() => {
8598
+ const [isCorrect, setIsCorrect] = useState17(false);
8599
+ useEffect15(() => {
8543
8600
  const cq = getCurrentQuestion();
8544
8601
  if (!cq) {
8545
8602
  setIsCorrect(false);
@@ -8829,7 +8886,7 @@ var QuizDissertative = ({ paddingBottom }) => {
8829
8886
  textareaRef.current.style.height = `${newHeight}px`;
8830
8887
  }
8831
8888
  }, []);
8832
- useEffect14(() => {
8889
+ useEffect15(() => {
8833
8890
  adjustTextareaHeight();
8834
8891
  }, [currentAnswer, adjustTextareaHeight]);
8835
8892
  if (!currentQuestion) {
@@ -8968,7 +9025,7 @@ var QuizConnectDots = ({ paddingBottom }) => {
8968
9025
  isCorrect: false
8969
9026
  }
8970
9027
  ];
8971
- const [userAnswers, setUserAnswers] = useState16(() => {
9028
+ const [userAnswers, setUserAnswers] = useState17(() => {
8972
9029
  if (variant === "result") {
8973
9030
  return mockUserAnswers;
8974
9031
  }
@@ -9087,7 +9144,7 @@ var QuizFill = ({ paddingBottom }) => {
9087
9144
  isCorrect: true
9088
9145
  }
9089
9146
  ];
9090
- const [answers, setAnswers] = useState16({});
9147
+ const [answers, setAnswers] = useState17({});
9091
9148
  const baseId = useId10();
9092
9149
  const getAvailableOptionsForSelect = (selectId) => {
9093
9150
  const usedOptions = Object.entries(answers).filter(([key]) => key !== selectId).map(([, value]) => value);
@@ -9225,7 +9282,7 @@ var QuizImageQuestion = ({ paddingBottom }) => {
9225
9282
  };
9226
9283
  const correctRadiusRelative = calculateCorrectRadiusRelative();
9227
9284
  const mockUserAnswerRelative = { x: 0.72, y: 0.348 };
9228
- const [clickPositionRelative, setClickPositionRelative] = useState16(variant == "result" ? mockUserAnswerRelative : null);
9285
+ const [clickPositionRelative, setClickPositionRelative] = useState17(variant == "result" ? mockUserAnswerRelative : null);
9229
9286
  const convertToRelativeCoordinates = (x, y, rect) => {
9230
9287
  const safeWidth = Math.max(rect.width, 1e-3);
9231
9288
  const safeHeight = Math.max(rect.height, 1e-3);
@@ -9449,11 +9506,11 @@ var QuizFooter = forwardRef19(
9449
9506
  const currentAnswer = getCurrentAnswer();
9450
9507
  const currentQuestion = getCurrentQuestion();
9451
9508
  const isCurrentQuestionSkipped = currentQuestion ? getQuestionStatusFromUserAnswers(currentQuestion.id) === "skipped" : false;
9452
- const [alertDialogOpen, setAlertDialogOpen] = useState16(false);
9453
- const [modalResultOpen, setModalResultOpen] = useState16(false);
9454
- const [modalNavigateOpen, setModalNavigateOpen] = useState16(false);
9455
- const [modalResolutionOpen, setModalResolutionOpen] = useState16(false);
9456
- const [filterType, setFilterType] = useState16(void 0);
9509
+ const [alertDialogOpen, setAlertDialogOpen] = useState17(false);
9510
+ const [modalResultOpen, setModalResultOpen] = useState17(false);
9511
+ const [modalNavigateOpen, setModalNavigateOpen] = useState17(false);
9512
+ const [modalResolutionOpen, setModalResolutionOpen] = useState17(false);
9513
+ const [filterType, setFilterType] = useState17(void 0);
9457
9514
  const unansweredQuestions = getUnansweredQuestionsFromUserAnswers();
9458
9515
  const allQuestions = getTotalQuestions();
9459
9516
  const handleFinishQuiz = async () => {
@@ -10007,11 +10064,13 @@ export {
10007
10064
  VideoPlayer_default as VideoPlayer,
10008
10065
  Whiteboard_default as Whiteboard,
10009
10066
  createZustandAuthAdapter,
10067
+ getDeviceType,
10010
10068
  getRootDomain,
10011
10069
  getStatusBadge,
10012
10070
  useApiConfig,
10013
10071
  useAuth,
10014
10072
  useAuthGuard,
10073
+ useMobile,
10015
10074
  useQuizStore,
10016
10075
  useRouteAuth,
10017
10076
  ToastStore_default as useToastStore,