@cuemath/leap 3.4.4 → 3.4.5-aa0

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.
@@ -1,5 +1,5 @@
1
1
  import { PLUGINS as _ } from "../../../node_modules/@cuemath/analytics-v2/dist/constants.js";
2
- var t = /* @__PURE__ */ ((e) => (e.START_SIGNUP_CTA_CLICKED = "start_signup_cta_clicked", e.ECNA_STEP_VIEWED = "ecna_step_viewed", e.ECNA_RESPONSE_RECORDED_DEBUG = "ecna_response_recorded_debug", e.PARENT_SIGNUP_CTA_CLICKED = "parent_signup_cta_clicked", e.PARENT_SIGNUP_SUCCESSFUL = "parent_signup_successful", e.PARENT_SIGNUP_FAILED = "parent_signup_failed", e.STUDENT_SIGNUP_SUCCESSFUL = "signup_successful", e.STUDENT_SIGNUP_FAILED = "signup_failed", e.SIGNUP_OTP_ENTERED = "signup_otp_entered", e.SIGNUP_OTP_VERIFIED = "signup_otp_verified", e.SIGNUP_OTP_FAILED = "signup_otp_failed", e.SLOTS_SHOWN = "slots_shown", e.SLOT_DATE_SELECTED = "slot_date_selected", e.SLOT_TIME_SELECTED = "slot_time_selected", e.TUTOR_CHANGE_REASON_SELECTED = "tutor_change_reason_selected", e.SUBSCRIPTION_CANCELLATION_FAILED = "subscription_cancellation_failed", e.SUBSCRIPTION_CANCELLATION_SUCCESSFUL = "subscription_cancellation_successful", e.STRIPE_INTENT_FAILED_RETRY = "stripe_intent_failed_retry", e.SUBSCRIPTION_INTENT_FAILED = "subscription_intent_failed", e.SUBSCRIPTION_INTENT_CREATED = "subscription_intent_created", e.STRIPE_PAYMENT_ELEMENT_READY = "stripe_payment_element_ready", e.STRIPE_PAYMENT_FAILED = "stripe_payment_failed", e.STRIPE_PAYMENT_SUCCESS = "stripe_payment_success", e.PAYMENT_PLAN_SELECTED = "payment_plan_selected", e.STRIPE_PAYMENT_ELEMENT_MOUNT_FAILED = "stripe_payment_element_mount_failed", e))(t || {});
2
+ var t = /* @__PURE__ */ ((e) => (e.START_SIGNUP_CTA_CLICKED = "start_signup_cta_clicked", e.SIGNUP_TO_LOGIN_CTA_CLICKED = "signup_to_login_cta_clicked", e.ECNA_STEP_VIEWED = "ecna_step_viewed", e.ECNA_RESPONSE_RECORDED_DEBUG = "ecna_response_recorded_debug", e.PARENT_SIGNUP_CTA_CLICKED = "parent_signup_cta_clicked", e.PARENT_SIGNUP_SUCCESSFUL = "parent_signup_successful", e.PARENT_SIGNUP_FAILED = "parent_signup_failed", e.STUDENT_SIGNUP_SUCCESSFUL = "signup_successful", e.STUDENT_SIGNUP_FAILED = "signup_failed", e.SIGNUP_OTP_ENTERED = "signup_otp_entered", e.SIGNUP_OTP_VERIFIED = "signup_otp_verified", e.SIGNUP_OTP_FAILED = "signup_otp_failed", e.SLOTS_SHOWN = "slots_shown", e.SLOT_DATE_SELECTED = "slot_date_selected", e.SLOT_TIME_SELECTED = "slot_time_selected", e.TUTOR_CHANGE_REASON_SELECTED = "tutor_change_reason_selected", e.SUBSCRIPTION_CANCELLATION_FAILED = "subscription_cancellation_failed", e.SUBSCRIPTION_CANCELLATION_SUCCESSFUL = "subscription_cancellation_successful", e.STRIPE_INTENT_FAILED_RETRY = "stripe_intent_failed_retry", e.SUBSCRIPTION_INTENT_FAILED = "subscription_intent_failed", e.SUBSCRIPTION_INTENT_CREATED = "subscription_intent_created", e.STRIPE_PAYMENT_ELEMENT_READY = "stripe_payment_element_ready", e.STRIPE_PAYMENT_FAILED = "stripe_payment_failed", e.STRIPE_PAYMENT_SUCCESS = "stripe_payment_success", e.PAYMENT_PLAN_SELECTED = "payment_plan_selected", e.STRIPE_PAYMENT_ELEMENT_MOUNT_FAILED = "stripe_payment_element_mount_failed", e))(t || {});
3
3
  const n = {
4
4
  start_signup_cta_clicked: [_.MIXPANEL],
5
5
  ecna_step_viewed: [_.MIXPANEL],
@@ -1 +1 @@
1
- {"version":3,"file":"pla-analytics-events.js","sources":["../../../../src/features/auth/pla-signup/pla-analytics-events.ts"],"sourcesContent":["import { PLUGINS } from '@cuemath/analytics-v2/dist/constants';\n\nexport enum PLA_ANALYTICS_EVENTS {\n START_SIGNUP_CTA_CLICKED = 'start_signup_cta_clicked',\n ECNA_STEP_VIEWED = 'ecna_step_viewed',\n ECNA_RESPONSE_RECORDED_DEBUG = 'ecna_response_recorded_debug',\n PARENT_SIGNUP_CTA_CLICKED = 'parent_signup_cta_clicked',\n PARENT_SIGNUP_SUCCESSFUL = 'parent_signup_successful',\n PARENT_SIGNUP_FAILED = 'parent_signup_failed',\n STUDENT_SIGNUP_SUCCESSFUL = 'signup_successful',\n STUDENT_SIGNUP_FAILED = 'signup_failed',\n SIGNUP_OTP_ENTERED = 'signup_otp_entered',\n SIGNUP_OTP_VERIFIED = 'signup_otp_verified',\n SIGNUP_OTP_FAILED = 'signup_otp_failed',\n SLOTS_SHOWN = 'slots_shown',\n SLOT_DATE_SELECTED = 'slot_date_selected',\n SLOT_TIME_SELECTED = 'slot_time_selected',\n TUTOR_CHANGE_REASON_SELECTED = 'tutor_change_reason_selected',\n SUBSCRIPTION_CANCELLATION_FAILED = 'subscription_cancellation_failed',\n SUBSCRIPTION_CANCELLATION_SUCCESSFUL = 'subscription_cancellation_successful',\n STRIPE_INTENT_FAILED_RETRY = 'stripe_intent_failed_retry',\n SUBSCRIPTION_INTENT_FAILED = 'subscription_intent_failed',\n SUBSCRIPTION_INTENT_CREATED = 'subscription_intent_created',\n STRIPE_PAYMENT_ELEMENT_READY = 'stripe_payment_element_ready',\n STRIPE_PAYMENT_FAILED = 'stripe_payment_failed',\n STRIPE_PAYMENT_SUCCESS = 'stripe_payment_success',\n PAYMENT_PLAN_SELECTED = 'payment_plan_selected',\n STRIPE_PAYMENT_ELEMENT_MOUNT_FAILED = 'stripe_payment_element_mount_failed',\n}\n\nexport const PLA_ANALYTICS_WHITELIST_EVENTS = {\n [PLA_ANALYTICS_EVENTS.START_SIGNUP_CTA_CLICKED]: [PLUGINS.MIXPANEL],\n [PLA_ANALYTICS_EVENTS.ECNA_STEP_VIEWED]: [PLUGINS.MIXPANEL],\n [PLA_ANALYTICS_EVENTS.ECNA_RESPONSE_RECORDED_DEBUG]: [PLUGINS.MIXPANEL],\n [PLA_ANALYTICS_EVENTS.PARENT_SIGNUP_CTA_CLICKED]: [PLUGINS.MIXPANEL],\n [PLA_ANALYTICS_EVENTS.PARENT_SIGNUP_SUCCESSFUL]: [PLUGINS.MIXPANEL],\n [PLA_ANALYTICS_EVENTS.PARENT_SIGNUP_FAILED]: [PLUGINS.MIXPANEL],\n [PLA_ANALYTICS_EVENTS.STUDENT_SIGNUP_SUCCESSFUL]: [PLUGINS.MIXPANEL],\n [PLA_ANALYTICS_EVENTS.STUDENT_SIGNUP_FAILED]: [PLUGINS.MIXPANEL],\n [PLA_ANALYTICS_EVENTS.SIGNUP_OTP_ENTERED]: [PLUGINS.MIXPANEL],\n [PLA_ANALYTICS_EVENTS.SIGNUP_OTP_VERIFIED]: [PLUGINS.MIXPANEL],\n [PLA_ANALYTICS_EVENTS.SIGNUP_OTP_FAILED]: [PLUGINS.MIXPANEL],\n [PLA_ANALYTICS_EVENTS.SLOTS_SHOWN]: [PLUGINS.MIXPANEL],\n [PLA_ANALYTICS_EVENTS.SLOT_DATE_SELECTED]: [PLUGINS.MIXPANEL],\n [PLA_ANALYTICS_EVENTS.SLOT_TIME_SELECTED]: [PLUGINS.MIXPANEL],\n [PLA_ANALYTICS_EVENTS.TUTOR_CHANGE_REASON_SELECTED]: [PLUGINS.MIXPANEL],\n [PLA_ANALYTICS_EVENTS.SUBSCRIPTION_CANCELLATION_FAILED]: [PLUGINS.MIXPANEL],\n [PLA_ANALYTICS_EVENTS.SUBSCRIPTION_CANCELLATION_SUCCESSFUL]: [PLUGINS.MIXPANEL],\n [PLA_ANALYTICS_EVENTS.SUBSCRIPTION_INTENT_FAILED]: [PLUGINS.MIXPANEL],\n [PLA_ANALYTICS_EVENTS.SUBSCRIPTION_INTENT_CREATED]: [PLUGINS.MIXPANEL],\n [PLA_ANALYTICS_EVENTS.STRIPE_PAYMENT_ELEMENT_READY]: [PLUGINS.MIXPANEL],\n [PLA_ANALYTICS_EVENTS.STRIPE_PAYMENT_FAILED]: [PLUGINS.MIXPANEL],\n [PLA_ANALYTICS_EVENTS.STRIPE_PAYMENT_SUCCESS]: [PLUGINS.MIXPANEL],\n [PLA_ANALYTICS_EVENTS.PAYMENT_PLAN_SELECTED]: [PLUGINS.MIXPANEL],\n [PLA_ANALYTICS_EVENTS.STRIPE_PAYMENT_ELEMENT_MOUNT_FAILED]: [PLUGINS.MIXPANEL],\n [PLA_ANALYTICS_EVENTS.STRIPE_INTENT_FAILED_RETRY]: [PLUGINS.MIXPANEL],\n};\n"],"names":["PLA_ANALYTICS_EVENTS","PLA_ANALYTICS_WHITELIST_EVENTS","PLUGINS"],"mappings":";AAEY,IAAAA,sBAAAA,OACVA,EAAA,2BAA2B,4BAC3BA,EAAA,mBAAmB,oBACnBA,EAAA,+BAA+B,gCAC/BA,EAAA,4BAA4B,6BAC5BA,EAAA,2BAA2B,4BAC3BA,EAAA,uBAAuB,wBACvBA,EAAA,4BAA4B,qBAC5BA,EAAA,wBAAwB,iBACxBA,EAAA,qBAAqB,sBACrBA,EAAA,sBAAsB,uBACtBA,EAAA,oBAAoB,qBACpBA,EAAA,cAAc,eACdA,EAAA,qBAAqB,sBACrBA,EAAA,qBAAqB,sBACrBA,EAAA,+BAA+B,gCAC/BA,EAAA,mCAAmC,oCACnCA,EAAA,uCAAuC,wCACvCA,EAAA,6BAA6B,8BAC7BA,EAAA,6BAA6B,8BAC7BA,EAAA,8BAA8B,+BAC9BA,EAAA,+BAA+B,gCAC/BA,EAAA,wBAAwB,yBACxBA,EAAA,yBAAyB,0BACzBA,EAAA,wBAAwB,yBACxBA,EAAA,sCAAsC,uCAzB5BA,IAAAA,KAAA,CAAA,CAAA;AA4BL,MAAMC,IAAiC;AAAA,EAC3C,0BAAgD,CAACC,EAAQ,QAAQ;AAAA,EACjE,kBAAwC,CAACA,EAAQ,QAAQ;AAAA,EACzD,8BAAoD,CAACA,EAAQ,QAAQ;AAAA,EACrE,2BAAiD,CAACA,EAAQ,QAAQ;AAAA,EAClE,0BAAgD,CAACA,EAAQ,QAAQ;AAAA,EACjE,sBAA4C,CAACA,EAAQ,QAAQ;AAAA,EAC7D,mBAAiD,CAACA,EAAQ,QAAQ;AAAA,EAClE,eAA6C,CAACA,EAAQ,QAAQ;AAAA,EAC9D,oBAA0C,CAACA,EAAQ,QAAQ;AAAA,EAC3D,qBAA2C,CAACA,EAAQ,QAAQ;AAAA,EAC5D,mBAAyC,CAACA,EAAQ,QAAQ;AAAA,EAC1D,aAAmC,CAACA,EAAQ,QAAQ;AAAA,EACpD,oBAA0C,CAACA,EAAQ,QAAQ;AAAA,EAC3D,oBAA0C,CAACA,EAAQ,QAAQ;AAAA,EAC3D,8BAAoD,CAACA,EAAQ,QAAQ;AAAA,EACrE,kCAAwD,CAACA,EAAQ,QAAQ;AAAA,EACzE,sCAA4D,CAACA,EAAQ,QAAQ;AAAA,EAC7E,4BAAkD,CAACA,EAAQ,QAAQ;AAAA,EACnE,6BAAmD,CAACA,EAAQ,QAAQ;AAAA,EACpE,8BAAoD,CAACA,EAAQ,QAAQ;AAAA,EACrE,uBAA6C,CAACA,EAAQ,QAAQ;AAAA,EAC9D,wBAA8C,CAACA,EAAQ,QAAQ;AAAA,EAC/D,uBAA6C,CAACA,EAAQ,QAAQ;AAAA,EAC9D,qCAA2D,CAACA,EAAQ,QAAQ;AAAA,EAC5E,4BAAkD,CAACA,EAAQ,QAAQ;AACtE;"}
1
+ {"version":3,"file":"pla-analytics-events.js","sources":["../../../../src/features/auth/pla-signup/pla-analytics-events.ts"],"sourcesContent":["import { PLUGINS } from '@cuemath/analytics-v2/dist/constants';\n\nexport enum PLA_ANALYTICS_EVENTS {\n START_SIGNUP_CTA_CLICKED = 'start_signup_cta_clicked',\n SIGNUP_TO_LOGIN_CTA_CLICKED = 'signup_to_login_cta_clicked',\n ECNA_STEP_VIEWED = 'ecna_step_viewed',\n ECNA_RESPONSE_RECORDED_DEBUG = 'ecna_response_recorded_debug',\n PARENT_SIGNUP_CTA_CLICKED = 'parent_signup_cta_clicked',\n PARENT_SIGNUP_SUCCESSFUL = 'parent_signup_successful',\n PARENT_SIGNUP_FAILED = 'parent_signup_failed',\n STUDENT_SIGNUP_SUCCESSFUL = 'signup_successful',\n STUDENT_SIGNUP_FAILED = 'signup_failed',\n SIGNUP_OTP_ENTERED = 'signup_otp_entered',\n SIGNUP_OTP_VERIFIED = 'signup_otp_verified',\n SIGNUP_OTP_FAILED = 'signup_otp_failed',\n SLOTS_SHOWN = 'slots_shown',\n SLOT_DATE_SELECTED = 'slot_date_selected',\n SLOT_TIME_SELECTED = 'slot_time_selected',\n TUTOR_CHANGE_REASON_SELECTED = 'tutor_change_reason_selected',\n SUBSCRIPTION_CANCELLATION_FAILED = 'subscription_cancellation_failed',\n SUBSCRIPTION_CANCELLATION_SUCCESSFUL = 'subscription_cancellation_successful',\n STRIPE_INTENT_FAILED_RETRY = 'stripe_intent_failed_retry',\n SUBSCRIPTION_INTENT_FAILED = 'subscription_intent_failed',\n SUBSCRIPTION_INTENT_CREATED = 'subscription_intent_created',\n STRIPE_PAYMENT_ELEMENT_READY = 'stripe_payment_element_ready',\n STRIPE_PAYMENT_FAILED = 'stripe_payment_failed',\n STRIPE_PAYMENT_SUCCESS = 'stripe_payment_success',\n PAYMENT_PLAN_SELECTED = 'payment_plan_selected',\n STRIPE_PAYMENT_ELEMENT_MOUNT_FAILED = 'stripe_payment_element_mount_failed',\n}\n\nexport const PLA_ANALYTICS_WHITELIST_EVENTS = {\n [PLA_ANALYTICS_EVENTS.START_SIGNUP_CTA_CLICKED]: [PLUGINS.MIXPANEL],\n [PLA_ANALYTICS_EVENTS.ECNA_STEP_VIEWED]: [PLUGINS.MIXPANEL],\n [PLA_ANALYTICS_EVENTS.ECNA_RESPONSE_RECORDED_DEBUG]: [PLUGINS.MIXPANEL],\n [PLA_ANALYTICS_EVENTS.PARENT_SIGNUP_CTA_CLICKED]: [PLUGINS.MIXPANEL],\n [PLA_ANALYTICS_EVENTS.PARENT_SIGNUP_SUCCESSFUL]: [PLUGINS.MIXPANEL],\n [PLA_ANALYTICS_EVENTS.PARENT_SIGNUP_FAILED]: [PLUGINS.MIXPANEL],\n [PLA_ANALYTICS_EVENTS.STUDENT_SIGNUP_SUCCESSFUL]: [PLUGINS.MIXPANEL],\n [PLA_ANALYTICS_EVENTS.STUDENT_SIGNUP_FAILED]: [PLUGINS.MIXPANEL],\n [PLA_ANALYTICS_EVENTS.SIGNUP_OTP_ENTERED]: [PLUGINS.MIXPANEL],\n [PLA_ANALYTICS_EVENTS.SIGNUP_OTP_VERIFIED]: [PLUGINS.MIXPANEL],\n [PLA_ANALYTICS_EVENTS.SIGNUP_OTP_FAILED]: [PLUGINS.MIXPANEL],\n [PLA_ANALYTICS_EVENTS.SLOTS_SHOWN]: [PLUGINS.MIXPANEL],\n [PLA_ANALYTICS_EVENTS.SLOT_DATE_SELECTED]: [PLUGINS.MIXPANEL],\n [PLA_ANALYTICS_EVENTS.SLOT_TIME_SELECTED]: [PLUGINS.MIXPANEL],\n [PLA_ANALYTICS_EVENTS.TUTOR_CHANGE_REASON_SELECTED]: [PLUGINS.MIXPANEL],\n [PLA_ANALYTICS_EVENTS.SUBSCRIPTION_CANCELLATION_FAILED]: [PLUGINS.MIXPANEL],\n [PLA_ANALYTICS_EVENTS.SUBSCRIPTION_CANCELLATION_SUCCESSFUL]: [PLUGINS.MIXPANEL],\n [PLA_ANALYTICS_EVENTS.SUBSCRIPTION_INTENT_FAILED]: [PLUGINS.MIXPANEL],\n [PLA_ANALYTICS_EVENTS.SUBSCRIPTION_INTENT_CREATED]: [PLUGINS.MIXPANEL],\n [PLA_ANALYTICS_EVENTS.STRIPE_PAYMENT_ELEMENT_READY]: [PLUGINS.MIXPANEL],\n [PLA_ANALYTICS_EVENTS.STRIPE_PAYMENT_FAILED]: [PLUGINS.MIXPANEL],\n [PLA_ANALYTICS_EVENTS.STRIPE_PAYMENT_SUCCESS]: [PLUGINS.MIXPANEL],\n [PLA_ANALYTICS_EVENTS.PAYMENT_PLAN_SELECTED]: [PLUGINS.MIXPANEL],\n [PLA_ANALYTICS_EVENTS.STRIPE_PAYMENT_ELEMENT_MOUNT_FAILED]: [PLUGINS.MIXPANEL],\n [PLA_ANALYTICS_EVENTS.STRIPE_INTENT_FAILED_RETRY]: [PLUGINS.MIXPANEL],\n};\n"],"names":["PLA_ANALYTICS_EVENTS","PLA_ANALYTICS_WHITELIST_EVENTS","PLUGINS"],"mappings":";AAEY,IAAAA,sBAAAA,OACVA,EAAA,2BAA2B,4BAC3BA,EAAA,8BAA8B,+BAC9BA,EAAA,mBAAmB,oBACnBA,EAAA,+BAA+B,gCAC/BA,EAAA,4BAA4B,6BAC5BA,EAAA,2BAA2B,4BAC3BA,EAAA,uBAAuB,wBACvBA,EAAA,4BAA4B,qBAC5BA,EAAA,wBAAwB,iBACxBA,EAAA,qBAAqB,sBACrBA,EAAA,sBAAsB,uBACtBA,EAAA,oBAAoB,qBACpBA,EAAA,cAAc,eACdA,EAAA,qBAAqB,sBACrBA,EAAA,qBAAqB,sBACrBA,EAAA,+BAA+B,gCAC/BA,EAAA,mCAAmC,oCACnCA,EAAA,uCAAuC,wCACvCA,EAAA,6BAA6B,8BAC7BA,EAAA,6BAA6B,8BAC7BA,EAAA,8BAA8B,+BAC9BA,EAAA,+BAA+B,gCAC/BA,EAAA,wBAAwB,yBACxBA,EAAA,yBAAyB,0BACzBA,EAAA,wBAAwB,yBACxBA,EAAA,sCAAsC,uCA1B5BA,IAAAA,KAAA,CAAA,CAAA;AA6BL,MAAMC,IAAiC;AAAA,EAC3C,0BAAgD,CAACC,EAAQ,QAAQ;AAAA,EACjE,kBAAwC,CAACA,EAAQ,QAAQ;AAAA,EACzD,8BAAoD,CAACA,EAAQ,QAAQ;AAAA,EACrE,2BAAiD,CAACA,EAAQ,QAAQ;AAAA,EAClE,0BAAgD,CAACA,EAAQ,QAAQ;AAAA,EACjE,sBAA4C,CAACA,EAAQ,QAAQ;AAAA,EAC7D,mBAAiD,CAACA,EAAQ,QAAQ;AAAA,EAClE,eAA6C,CAACA,EAAQ,QAAQ;AAAA,EAC9D,oBAA0C,CAACA,EAAQ,QAAQ;AAAA,EAC3D,qBAA2C,CAACA,EAAQ,QAAQ;AAAA,EAC5D,mBAAyC,CAACA,EAAQ,QAAQ;AAAA,EAC1D,aAAmC,CAACA,EAAQ,QAAQ;AAAA,EACpD,oBAA0C,CAACA,EAAQ,QAAQ;AAAA,EAC3D,oBAA0C,CAACA,EAAQ,QAAQ;AAAA,EAC3D,8BAAoD,CAACA,EAAQ,QAAQ;AAAA,EACrE,kCAAwD,CAACA,EAAQ,QAAQ;AAAA,EACzE,sCAA4D,CAACA,EAAQ,QAAQ;AAAA,EAC7E,4BAAkD,CAACA,EAAQ,QAAQ;AAAA,EACnE,6BAAmD,CAACA,EAAQ,QAAQ;AAAA,EACpE,8BAAoD,CAACA,EAAQ,QAAQ;AAAA,EACrE,uBAA6C,CAACA,EAAQ,QAAQ;AAAA,EAC9D,wBAA8C,CAACA,EAAQ,QAAQ;AAAA,EAC/D,uBAA6C,CAACA,EAAQ,QAAQ;AAAA,EAC9D,qCAA2D,CAACA,EAAQ,QAAQ;AAAA,EAC5E,4BAAkD,CAACA,EAAQ,QAAQ;AACtE;"}
@@ -1,29 +1,29 @@
1
- import { jsxs as i, jsx as e } from "react/jsx-runtime";
2
- import { memo as b } from "react";
3
- import { useTheme as g } from "styled-components";
4
- import I from "../../../../assets/line-icons/icons/apple-icon-white.js";
5
- import C from "../../../../assets/line-icons/icons/google-icon.js";
6
- import l from "../../../ui/buttons/button/button.js";
1
+ import { jsxs as l, jsx as e } from "react/jsx-runtime";
2
+ import { memo as C } from "react";
3
+ import { useTheme as b } from "styled-components";
4
+ import f from "../../../../assets/line-icons/icons/apple-icon-white.js";
5
+ import g from "../../../../assets/line-icons/icons/google-icon.js";
6
+ import r from "../../../ui/buttons/button/button.js";
7
7
  import u from "../../../ui/buttons/text-button/text-button.js";
8
- import r from "../../../ui/layout/flex-view.js";
9
- import p from "../../../ui/separator/separator.js";
10
- import c from "../../../ui/text/text.js";
11
- import { EDeviceType as $ } from "../../../ui/theme/constants.js";
12
- import { PLA_ANALYTICS_EVENTS as t } from "../pla-analytics-events.js";
13
- const S = ({
8
+ import t from "../../../ui/layout/flex-view.js";
9
+ import c from "../../../ui/separator/separator.js";
10
+ import p from "../../../ui/text/text.js";
11
+ import { EDeviceType as L } from "../../../ui/theme/constants.js";
12
+ import { PLA_ANALYTICS_EVENTS as i } from "../pla-analytics-events.js";
13
+ const _ = ({
14
14
  onEmailSignup: m,
15
15
  onAppleSignup: d,
16
16
  onGoogleSignup: h,
17
- loadingProvider: n,
18
- onGoToLogin: A,
19
- title: T
17
+ loadingProvider: a,
18
+ onGoToLogin: T,
19
+ title: A
20
20
  }) => {
21
- const { device: f } = g(), o = f <= $.TABLET, a = n === "google", s = n === "apple";
22
- return /* @__PURE__ */ i(r, { $alignItems: "flex-start", children: [
23
- /* @__PURE__ */ e(c, { $renderAs: "ah3-bold", $renderOnMobileAs: "ah4-bold", $color: "WHITE", $whiteSpace: "pre-line", children: T }),
24
- /* @__PURE__ */ e(p, { heightX: o ? 1.5 : 2.5 }),
25
- /* @__PURE__ */ i(
26
- r,
21
+ const { device: I } = b(), o = I <= L.TABLET, n = a === "google", s = a === "apple";
22
+ return /* @__PURE__ */ l(t, { $alignItems: "flex-start", children: [
23
+ /* @__PURE__ */ e(p, { $renderAs: "ah3-bold", $renderOnMobileAs: "ah4-bold", $color: "WHITE", $whiteSpace: "pre-line", children: A }),
24
+ /* @__PURE__ */ e(c, { heightX: o ? 1.5 : 2.5 }),
25
+ /* @__PURE__ */ l(
26
+ t,
27
27
  {
28
28
  $flexGapX: 1,
29
29
  $flex: 1,
@@ -32,59 +32,68 @@ const S = ({
32
32
  $width: "100%",
33
33
  children: [
34
34
  /* @__PURE__ */ e(
35
- l,
35
+ r,
36
36
  {
37
37
  renderAs: "black-dark",
38
- Icon: C,
38
+ Icon: g,
39
39
  width: o ? "100%" : 320,
40
40
  label: "Signup with Google",
41
41
  onClick: h,
42
42
  size: "small",
43
- busy: a,
44
- disabled: a,
45
- analyticsLabel: t.START_SIGNUP_CTA_CLICKED,
43
+ busy: n,
44
+ disabled: n,
45
+ analyticsLabel: i.START_SIGNUP_CTA_CLICKED,
46
46
  analyticsProps: { provider: "google" }
47
47
  }
48
48
  ),
49
49
  /* @__PURE__ */ e(
50
- l,
50
+ r,
51
51
  {
52
52
  renderAs: "black-dark",
53
53
  size: "small",
54
54
  width: o ? "100%" : 320,
55
- Icon: I,
55
+ Icon: f,
56
56
  label: "Signup with Apple",
57
57
  onClick: d,
58
58
  busy: s,
59
59
  disabled: s,
60
- analyticsLabel: t.START_SIGNUP_CTA_CLICKED,
60
+ analyticsLabel: i.START_SIGNUP_CTA_CLICKED,
61
61
  analyticsProps: { provider: "apple" }
62
62
  }
63
63
  ),
64
64
  /* @__PURE__ */ e(
65
- l,
65
+ r,
66
66
  {
67
67
  renderAs: "black-dark",
68
68
  size: "small",
69
69
  width: o ? "100%" : 320,
70
70
  label: "Continue with Email",
71
71
  onClick: m,
72
- analyticsLabel: t.START_SIGNUP_CTA_CLICKED,
72
+ analyticsLabel: i.START_SIGNUP_CTA_CLICKED,
73
73
  analyticsProps: { provider: "email" }
74
74
  }
75
75
  )
76
76
  ]
77
77
  }
78
78
  ),
79
- /* @__PURE__ */ e(p, { heightX: 1.5 }),
80
- /* @__PURE__ */ i(r, { $flexDirection: "row", $alignItems: "center", children: [
81
- /* @__PURE__ */ e(c, { $renderAs: "ub3", $color: "WHITE", children: "Already have an account?" }),
79
+ /* @__PURE__ */ e(c, { heightX: 1.5 }),
80
+ /* @__PURE__ */ l(t, { $flexDirection: "row", $alignItems: "center", children: [
81
+ /* @__PURE__ */ e(p, { $renderAs: "ub3", $color: "WHITE", children: "Already have an account?" }),
82
82
  " ",
83
- /* @__PURE__ */ e(u, { size: "small", label: "Log In", color: "WHITE", onClick: A })
83
+ /* @__PURE__ */ e(
84
+ u,
85
+ {
86
+ analyticsLabel: i.SIGNUP_TO_LOGIN_CTA_CLICKED,
87
+ size: "small",
88
+ label: "Log In",
89
+ color: "WHITE",
90
+ onClick: T
91
+ }
92
+ )
84
93
  ] })
85
94
  ] });
86
- }, z = b(S);
95
+ }, O = C(_);
87
96
  export {
88
- z as default
97
+ O as default
89
98
  };
90
99
  //# sourceMappingURL=signup-options.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"signup-options.js","sources":["../../../../../src/features/auth/pla-signup/signup-options/signup-options.tsx"],"sourcesContent":["import { memo, type FC } from 'react';\nimport { useTheme } from 'styled-components';\n\nimport AppleIcon from '../../../../assets/line-icons/icons/apple-icon-white';\nimport GoogleIcon from '../../../../assets/line-icons/icons/google-icon';\nimport Button from '../../../ui/buttons/button/button';\nimport TextButton from '../../../ui/buttons/text-button/text-button';\nimport FlexView from '../../../ui/layout/flex-view';\nimport Separator from '../../../ui/separator/separator';\nimport Text from '../../../ui/text/text';\nimport { EDeviceType } from '../../../ui/theme/constants';\nimport { PLA_ANALYTICS_EVENTS } from '../pla-analytics-events';\nimport type { ISignupOptionsProps } from './signup-options-types';\n\nconst SignupOptions: FC<ISignupOptionsProps> = ({\n onEmailSignup,\n onAppleSignup,\n onGoogleSignup,\n loadingProvider,\n onGoToLogin,\n title,\n}) => {\n const { device } = useTheme();\n const isCompact = device <= EDeviceType.TABLET;\n const isLoadingGoogle = loadingProvider === 'google';\n const isLoadingApple = loadingProvider === 'apple';\n\n return (\n <FlexView $alignItems=\"flex-start\">\n <Text $renderAs=\"ah3-bold\" $renderOnMobileAs=\"ah4-bold\" $color=\"WHITE\" $whiteSpace=\"pre-line\">\n {title}\n </Text>\n <Separator heightX={isCompact ? 1.5 : 2.5} />\n <FlexView\n $flexGapX={1}\n $flex={1}\n $justifyContent=\"center\"\n $alignItems=\"flex-start\"\n $width=\"100%\"\n >\n <Button\n renderAs=\"black-dark\"\n Icon={GoogleIcon}\n width={isCompact ? '100%' : 320}\n label=\"Signup with Google\"\n onClick={onGoogleSignup}\n size=\"small\"\n busy={isLoadingGoogle}\n disabled={isLoadingGoogle}\n analyticsLabel={PLA_ANALYTICS_EVENTS.START_SIGNUP_CTA_CLICKED}\n analyticsProps={{ provider: 'google' }}\n />\n <Button\n renderAs=\"black-dark\"\n size=\"small\"\n width={isCompact ? '100%' : 320}\n Icon={AppleIcon}\n label=\"Signup with Apple\"\n onClick={onAppleSignup}\n busy={isLoadingApple}\n disabled={isLoadingApple}\n analyticsLabel={PLA_ANALYTICS_EVENTS.START_SIGNUP_CTA_CLICKED}\n analyticsProps={{ provider: 'apple' }}\n />\n <Button\n renderAs=\"black-dark\"\n size=\"small\"\n width={isCompact ? '100%' : 320}\n label=\"Continue with Email\"\n onClick={onEmailSignup}\n analyticsLabel={PLA_ANALYTICS_EVENTS.START_SIGNUP_CTA_CLICKED}\n analyticsProps={{ provider: 'email' }}\n />\n </FlexView>\n <Separator heightX={1.5} />\n <FlexView $flexDirection=\"row\" $alignItems=\"center\">\n <Text $renderAs=\"ub3\" $color=\"WHITE\">\n Already have an account?\n </Text>\n &nbsp;\n <TextButton size=\"small\" label=\"Log In\" color=\"WHITE\" onClick={onGoToLogin} />\n </FlexView>\n </FlexView>\n );\n};\n\nexport default memo(SignupOptions);\n"],"names":["SignupOptions","onEmailSignup","onAppleSignup","onGoogleSignup","loadingProvider","onGoToLogin","title","device","useTheme","isCompact","EDeviceType","isLoadingGoogle","isLoadingApple","jsxs","FlexView","jsx","Text","Separator","Button","GoogleIcon","PLA_ANALYTICS_EVENTS","AppleIcon","TextButton","signupOptions","memo"],"mappings":";;;;;;;;;;;;AAcA,MAAMA,IAAyC,CAAC;AAAA,EAC9C,eAAAC;AAAA,EACA,eAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,aAAAC;AAAA,EACA,OAAAC;AACF,MAAM;AACE,QAAA,EAAE,QAAAC,MAAWC,KACbC,IAAYF,KAAUG,EAAY,QAClCC,IAAkBP,MAAoB,UACtCQ,IAAiBR,MAAoB;AAGzC,SAAA,gBAAAS,EAACC,GAAS,EAAA,aAAY,cACpB,UAAA;AAAA,IAAC,gBAAAC,EAAAC,GAAA,EAAK,WAAU,YAAW,mBAAkB,YAAW,QAAO,SAAQ,aAAY,YAChF,UACHV,EAAA,CAAA;AAAA,IACC,gBAAAS,EAAAE,GAAA,EAAU,SAASR,IAAY,MAAM,KAAK;AAAA,IAC3C,gBAAAI;AAAA,MAACC;AAAA,MAAA;AAAA,QACC,WAAW;AAAA,QACX,OAAO;AAAA,QACP,iBAAgB;AAAA,QAChB,aAAY;AAAA,QACZ,QAAO;AAAA,QAEP,UAAA;AAAA,UAAA,gBAAAC;AAAA,YAACG;AAAA,YAAA;AAAA,cACC,UAAS;AAAA,cACT,MAAMC;AAAA,cACN,OAAOV,IAAY,SAAS;AAAA,cAC5B,OAAM;AAAA,cACN,SAASN;AAAA,cACT,MAAK;AAAA,cACL,MAAMQ;AAAA,cACN,UAAUA;AAAA,cACV,gBAAgBS,EAAqB;AAAA,cACrC,gBAAgB,EAAE,UAAU,SAAS;AAAA,YAAA;AAAA,UACvC;AAAA,UACA,gBAAAL;AAAA,YAACG;AAAA,YAAA;AAAA,cACC,UAAS;AAAA,cACT,MAAK;AAAA,cACL,OAAOT,IAAY,SAAS;AAAA,cAC5B,MAAMY;AAAAA,cACN,OAAM;AAAA,cACN,SAASnB;AAAA,cACT,MAAMU;AAAA,cACN,UAAUA;AAAA,cACV,gBAAgBQ,EAAqB;AAAA,cACrC,gBAAgB,EAAE,UAAU,QAAQ;AAAA,YAAA;AAAA,UACtC;AAAA,UACA,gBAAAL;AAAA,YAACG;AAAA,YAAA;AAAA,cACC,UAAS;AAAA,cACT,MAAK;AAAA,cACL,OAAOT,IAAY,SAAS;AAAA,cAC5B,OAAM;AAAA,cACN,SAASR;AAAA,cACT,gBAAgBmB,EAAqB;AAAA,cACrC,gBAAgB,EAAE,UAAU,QAAQ;AAAA,YAAA;AAAA,UACtC;AAAA,QAAA;AAAA,MAAA;AAAA,IACF;AAAA,IACA,gBAAAL,EAACE,GAAU,EAAA,SAAS,IAAK,CAAA;AAAA,IACxB,gBAAAJ,EAAAC,GAAA,EAAS,gBAAe,OAAM,aAAY,UACzC,UAAA;AAAA,MAAA,gBAAAC,EAACC,GAAK,EAAA,WAAU,OAAM,QAAO,SAAQ,UAErC,4BAAA;AAAA,MAAO;AAAA,MAEP,gBAAAD,EAACO,KAAW,MAAK,SAAQ,OAAM,UAAS,OAAM,SAAQ,SAASjB,EAAa,CAAA;AAAA,IAAA,GAC9E;AAAA,EACF,EAAA,CAAA;AAEJ,GAEekB,IAAAC,EAAKxB,CAAa;"}
1
+ {"version":3,"file":"signup-options.js","sources":["../../../../../src/features/auth/pla-signup/signup-options/signup-options.tsx"],"sourcesContent":["import { memo, type FC } from 'react';\nimport { useTheme } from 'styled-components';\n\nimport AppleIcon from '../../../../assets/line-icons/icons/apple-icon-white';\nimport GoogleIcon from '../../../../assets/line-icons/icons/google-icon';\nimport Button from '../../../ui/buttons/button/button';\nimport TextButton from '../../../ui/buttons/text-button/text-button';\nimport FlexView from '../../../ui/layout/flex-view';\nimport Separator from '../../../ui/separator/separator';\nimport Text from '../../../ui/text/text';\nimport { EDeviceType } from '../../../ui/theme/constants';\nimport { PLA_ANALYTICS_EVENTS } from '../pla-analytics-events';\nimport type { ISignupOptionsProps } from './signup-options-types';\n\nconst SignupOptions: FC<ISignupOptionsProps> = ({\n onEmailSignup,\n onAppleSignup,\n onGoogleSignup,\n loadingProvider,\n onGoToLogin,\n title,\n}) => {\n const { device } = useTheme();\n const isCompact = device <= EDeviceType.TABLET;\n const isLoadingGoogle = loadingProvider === 'google';\n const isLoadingApple = loadingProvider === 'apple';\n\n return (\n <FlexView $alignItems=\"flex-start\">\n <Text $renderAs=\"ah3-bold\" $renderOnMobileAs=\"ah4-bold\" $color=\"WHITE\" $whiteSpace=\"pre-line\">\n {title}\n </Text>\n <Separator heightX={isCompact ? 1.5 : 2.5} />\n <FlexView\n $flexGapX={1}\n $flex={1}\n $justifyContent=\"center\"\n $alignItems=\"flex-start\"\n $width=\"100%\"\n >\n <Button\n renderAs=\"black-dark\"\n Icon={GoogleIcon}\n width={isCompact ? '100%' : 320}\n label=\"Signup with Google\"\n onClick={onGoogleSignup}\n size=\"small\"\n busy={isLoadingGoogle}\n disabled={isLoadingGoogle}\n analyticsLabel={PLA_ANALYTICS_EVENTS.START_SIGNUP_CTA_CLICKED}\n analyticsProps={{ provider: 'google' }}\n />\n <Button\n renderAs=\"black-dark\"\n size=\"small\"\n width={isCompact ? '100%' : 320}\n Icon={AppleIcon}\n label=\"Signup with Apple\"\n onClick={onAppleSignup}\n busy={isLoadingApple}\n disabled={isLoadingApple}\n analyticsLabel={PLA_ANALYTICS_EVENTS.START_SIGNUP_CTA_CLICKED}\n analyticsProps={{ provider: 'apple' }}\n />\n <Button\n renderAs=\"black-dark\"\n size=\"small\"\n width={isCompact ? '100%' : 320}\n label=\"Continue with Email\"\n onClick={onEmailSignup}\n analyticsLabel={PLA_ANALYTICS_EVENTS.START_SIGNUP_CTA_CLICKED}\n analyticsProps={{ provider: 'email' }}\n />\n </FlexView>\n <Separator heightX={1.5} />\n <FlexView $flexDirection=\"row\" $alignItems=\"center\">\n <Text $renderAs=\"ub3\" $color=\"WHITE\">\n Already have an account?\n </Text>\n &nbsp;\n <TextButton\n analyticsLabel={PLA_ANALYTICS_EVENTS.SIGNUP_TO_LOGIN_CTA_CLICKED}\n size=\"small\"\n label=\"Log In\"\n color=\"WHITE\"\n onClick={onGoToLogin}\n />\n </FlexView>\n </FlexView>\n );\n};\n\nexport default memo(SignupOptions);\n"],"names":["SignupOptions","onEmailSignup","onAppleSignup","onGoogleSignup","loadingProvider","onGoToLogin","title","device","useTheme","isCompact","EDeviceType","isLoadingGoogle","isLoadingApple","jsxs","FlexView","jsx","Text","Separator","Button","GoogleIcon","PLA_ANALYTICS_EVENTS","AppleIcon","TextButton","signupOptions","memo"],"mappings":";;;;;;;;;;;;AAcA,MAAMA,IAAyC,CAAC;AAAA,EAC9C,eAAAC;AAAA,EACA,eAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,aAAAC;AAAA,EACA,OAAAC;AACF,MAAM;AACE,QAAA,EAAE,QAAAC,MAAWC,KACbC,IAAYF,KAAUG,EAAY,QAClCC,IAAkBP,MAAoB,UACtCQ,IAAiBR,MAAoB;AAGzC,SAAA,gBAAAS,EAACC,GAAS,EAAA,aAAY,cACpB,UAAA;AAAA,IAAC,gBAAAC,EAAAC,GAAA,EAAK,WAAU,YAAW,mBAAkB,YAAW,QAAO,SAAQ,aAAY,YAChF,UACHV,EAAA,CAAA;AAAA,IACC,gBAAAS,EAAAE,GAAA,EAAU,SAASR,IAAY,MAAM,KAAK;AAAA,IAC3C,gBAAAI;AAAA,MAACC;AAAA,MAAA;AAAA,QACC,WAAW;AAAA,QACX,OAAO;AAAA,QACP,iBAAgB;AAAA,QAChB,aAAY;AAAA,QACZ,QAAO;AAAA,QAEP,UAAA;AAAA,UAAA,gBAAAC;AAAA,YAACG;AAAA,YAAA;AAAA,cACC,UAAS;AAAA,cACT,MAAMC;AAAA,cACN,OAAOV,IAAY,SAAS;AAAA,cAC5B,OAAM;AAAA,cACN,SAASN;AAAA,cACT,MAAK;AAAA,cACL,MAAMQ;AAAA,cACN,UAAUA;AAAA,cACV,gBAAgBS,EAAqB;AAAA,cACrC,gBAAgB,EAAE,UAAU,SAAS;AAAA,YAAA;AAAA,UACvC;AAAA,UACA,gBAAAL;AAAA,YAACG;AAAA,YAAA;AAAA,cACC,UAAS;AAAA,cACT,MAAK;AAAA,cACL,OAAOT,IAAY,SAAS;AAAA,cAC5B,MAAMY;AAAAA,cACN,OAAM;AAAA,cACN,SAASnB;AAAA,cACT,MAAMU;AAAA,cACN,UAAUA;AAAA,cACV,gBAAgBQ,EAAqB;AAAA,cACrC,gBAAgB,EAAE,UAAU,QAAQ;AAAA,YAAA;AAAA,UACtC;AAAA,UACA,gBAAAL;AAAA,YAACG;AAAA,YAAA;AAAA,cACC,UAAS;AAAA,cACT,MAAK;AAAA,cACL,OAAOT,IAAY,SAAS;AAAA,cAC5B,OAAM;AAAA,cACN,SAASR;AAAA,cACT,gBAAgBmB,EAAqB;AAAA,cACrC,gBAAgB,EAAE,UAAU,QAAQ;AAAA,YAAA;AAAA,UACtC;AAAA,QAAA;AAAA,MAAA;AAAA,IACF;AAAA,IACA,gBAAAL,EAACE,GAAU,EAAA,SAAS,IAAK,CAAA;AAAA,IACxB,gBAAAJ,EAAAC,GAAA,EAAS,gBAAe,OAAM,aAAY,UACzC,UAAA;AAAA,MAAA,gBAAAC,EAACC,GAAK,EAAA,WAAU,OAAM,QAAO,SAAQ,UAErC,4BAAA;AAAA,MAAO;AAAA,MAEP,gBAAAD;AAAA,QAACO;AAAA,QAAA;AAAA,UACC,gBAAgBF,EAAqB;AAAA,UACrC,MAAK;AAAA,UACL,OAAM;AAAA,UACN,OAAM;AAAA,UACN,SAASf;AAAA,QAAA;AAAA,MACX;AAAA,IAAA,GACF;AAAA,EACF,EAAA,CAAA;AAEJ,GAEekB,IAAAC,EAAKxB,CAAa;"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-get-troubleshooting-steps.js","sources":["../../../../../src/features/av/av-preview/hooks/use-get-troubleshooting-steps.ts"],"sourcesContent":["import type { TDeviceError } from '../av-preview-types';\n\ninterface IUseGetTroubleshootingInfo {\n (\n audioDeviceError?: TDeviceError,\n videoDeviceError?: TDeviceError,\n ):\n | {\n heading: string;\n steps: string[];\n imageElement?: React.ReactNode;\n }\n | undefined;\n}\n\n// window.location='x-apple.systempreferences:com.apple.preference.security?Privacy_Camera'\n// window.location='x-apple.systempreferences:com.apple.preference.security?Privacy_Microphone'\n\nconst useGetTroubleshootingInfo: IUseGetTroubleshootingInfo = (\n audioDeviceError,\n videoDeviceError,\n) => {\n switch (videoDeviceError) {\n case 'permissionDeniedBySystem':\n return {\n heading: 'Please allow your browser to access your camera from your system setting.',\n steps: [\n 'Open your system settings.',\n 'Navigate to Privacy & Security.',\n 'Find Camera permissions and ensure the browser is allowed access.',\n ],\n };\n case 'permissionDenied':\n return {\n heading: 'Please allow your browser to access your camera.',\n steps: [\n 'Click on the lock icon in the address bar.',\n 'Select \"Site settings\".',\n 'Find Camera permissions and ensure it is set to \"Allow\".',\n ],\n };\n case 'deviceNotFound':\n return {\n heading: 'No camera found',\n steps: [\n 'Ensure your camera is connected and turned on.',\n 'If you are using an external camera, check the connection.',\n 'Try refreshing the page or restarting your browser.',\n ],\n };\n case 'thirdPartyApps':\n return {\n heading: 'Camera is being used by another application',\n steps: [\n 'Close any other applications that might be using the camera.',\n 'Try refreshing the page or restarting your browser.',\n ],\n };\n case 'other':\n return {\n heading: 'An unknown error occurred with the camera',\n steps: [\n 'Try refreshing the page or restarting your browser.',\n 'Check if your camera is working in other applications.',\n 'If the issue persists, try using a different browser or device.',\n ],\n };\n }\n\n switch (audioDeviceError) {\n case 'permissionDeniedBySystem':\n return {\n heading: 'Please allow your browser to access your microphone from your system setting.',\n steps: [\n 'Open your system settings.',\n 'Navigate to Privacy & Security.',\n 'Find Microphone permissions and ensure the browser is allowed access.',\n ],\n };\n case 'permissionDenied':\n return {\n heading: 'Please allow your browser to access your microphone.',\n steps: [\n 'Click on the lock icon in the address bar.',\n 'Select \"Site settings\".',\n 'Find Microphone permissions and ensure it is set to \"Allow\".',\n ],\n };\n case 'deviceNotFound':\n return {\n heading: 'No microphone found',\n steps: [\n 'Ensure your microphone is connected and turned on.',\n 'If you are using an external microphone, check the connection.',\n 'Try refreshing the page or restarting your browser.',\n ],\n };\n case 'thirdPartyApps':\n return {\n heading: 'Microphone is being used by another application',\n steps: [\n 'Close any other applications that might be using the microphone.',\n 'Try refreshing the page or restarting your browser.',\n ],\n };\n case 'other':\n return {\n heading: 'An unknown error occurred with the microphone',\n steps: ['Try refreshing the page or restarting your browser.'],\n };\n }\n};\n\nexport default useGetTroubleshootingInfo;\n"],"names":["useGetTroubleshootingInfo","audioDeviceError","videoDeviceError"],"mappings":"AAkBM,MAAAA,IAAwD,CAC5DC,GACAC,MACG;AACH,UAAQA,GAAkB;AAAA,IACxB,KAAK;AACI,aAAA;AAAA,QACL,SAAS;AAAA,QACT,OAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MAAA;AAAA,IAEJ,KAAK;AACI,aAAA;AAAA,QACL,SAAS;AAAA,QACT,OAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MAAA;AAAA,IAEJ,KAAK;AACI,aAAA;AAAA,QACL,SAAS;AAAA,QACT,OAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MAAA;AAAA,IAEJ,KAAK;AACI,aAAA;AAAA,QACL,SAAS;AAAA,QACT,OAAO;AAAA,UACL;AAAA,UACA;AAAA,QACF;AAAA,MAAA;AAAA,IAEJ,KAAK;AACI,aAAA;AAAA,QACL,SAAS;AAAA,QACT,OAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MAAA;AAAA,EAEN;AAEA,UAAQD,GAAkB;AAAA,IACxB,KAAK;AACI,aAAA;AAAA,QACL,SAAS;AAAA,QACT,OAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MAAA;AAAA,IAEJ,KAAK;AACI,aAAA;AAAA,QACL,SAAS;AAAA,QACT,OAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MAAA;AAAA,IAEJ,KAAK;AACI,aAAA;AAAA,QACL,SAAS;AAAA,QACT,OAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MAAA;AAAA,IAEJ,KAAK;AACI,aAAA;AAAA,QACL,SAAS;AAAA,QACT,OAAO;AAAA,UACL;AAAA,UACA;AAAA,QACF;AAAA,MAAA;AAAA,IAEJ,KAAK;AACI,aAAA;AAAA,QACL,SAAS;AAAA,QACT,OAAO,CAAC,qDAAqD;AAAA,MAAA;AAAA,EAEnE;AACF;"}
1
+ {"version":3,"file":"use-get-troubleshooting-steps.js","sources":["../../../../../src/features/av/av-preview/hooks/use-get-troubleshooting-steps.ts"],"sourcesContent":["import { type TDeviceError } from '@cuemath/av/dist/types';\n\ninterface IUseGetTroubleshootingInfo {\n (\n audioDeviceError?: TDeviceError,\n videoDeviceError?: TDeviceError,\n ):\n | {\n heading: string;\n steps: string[];\n imageElement?: React.ReactNode;\n }\n | undefined;\n}\n\n// window.location='x-apple.systempreferences:com.apple.preference.security?Privacy_Camera'\n// window.location='x-apple.systempreferences:com.apple.preference.security?Privacy_Microphone'\n\nconst useGetTroubleshootingInfo: IUseGetTroubleshootingInfo = (\n audioDeviceError,\n videoDeviceError,\n) => {\n switch (videoDeviceError) {\n case 'permissionDeniedBySystem':\n return {\n heading: 'Please allow your browser to access your camera from your system setting.',\n steps: [\n 'Open your system settings.',\n 'Navigate to Privacy & Security.',\n 'Find Camera permissions and ensure the browser is allowed access.',\n ],\n };\n case 'permissionDenied':\n return {\n heading: 'Please allow your browser to access your camera.',\n steps: [\n 'Click on the lock icon in the address bar.',\n 'Select \"Site settings\".',\n 'Find Camera permissions and ensure it is set to \"Allow\".',\n ],\n };\n case 'deviceNotFound':\n return {\n heading: 'No camera found',\n steps: [\n 'Ensure your camera is connected and turned on.',\n 'If you are using an external camera, check the connection.',\n 'Try refreshing the page or restarting your browser.',\n ],\n };\n case 'thirdPartyApps':\n return {\n heading: 'Camera is being used by another application',\n steps: [\n 'Close any other applications that might be using the camera.',\n 'Try refreshing the page or restarting your browser.',\n ],\n };\n case 'other':\n return {\n heading: 'An unknown error occurred with the camera',\n steps: [\n 'Try refreshing the page or restarting your browser.',\n 'Check if your camera is working in other applications.',\n 'If the issue persists, try using a different browser or device.',\n ],\n };\n }\n\n switch (audioDeviceError) {\n case 'permissionDeniedBySystem':\n return {\n heading: 'Please allow your browser to access your microphone from your system setting.',\n steps: [\n 'Open your system settings.',\n 'Navigate to Privacy & Security.',\n 'Find Microphone permissions and ensure the browser is allowed access.',\n ],\n };\n case 'permissionDenied':\n return {\n heading: 'Please allow your browser to access your microphone.',\n steps: [\n 'Click on the lock icon in the address bar.',\n 'Select \"Site settings\".',\n 'Find Microphone permissions and ensure it is set to \"Allow\".',\n ],\n };\n case 'deviceNotFound':\n return {\n heading: 'No microphone found',\n steps: [\n 'Ensure your microphone is connected and turned on.',\n 'If you are using an external microphone, check the connection.',\n 'Try refreshing the page or restarting your browser.',\n ],\n };\n case 'thirdPartyApps':\n return {\n heading: 'Microphone is being used by another application',\n steps: [\n 'Close any other applications that might be using the microphone.',\n 'Try refreshing the page or restarting your browser.',\n ],\n };\n case 'other':\n return {\n heading: 'An unknown error occurred with the microphone',\n steps: ['Try refreshing the page or restarting your browser.'],\n };\n }\n};\n\nexport default useGetTroubleshootingInfo;\n"],"names":["useGetTroubleshootingInfo","audioDeviceError","videoDeviceError"],"mappings":"AAkBM,MAAAA,IAAwD,CAC5DC,GACAC,MACG;AACH,UAAQA,GAAkB;AAAA,IACxB,KAAK;AACI,aAAA;AAAA,QACL,SAAS;AAAA,QACT,OAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MAAA;AAAA,IAEJ,KAAK;AACI,aAAA;AAAA,QACL,SAAS;AAAA,QACT,OAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MAAA;AAAA,IAEJ,KAAK;AACI,aAAA;AAAA,QACL,SAAS;AAAA,QACT,OAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MAAA;AAAA,IAEJ,KAAK;AACI,aAAA;AAAA,QACL,SAAS;AAAA,QACT,OAAO;AAAA,UACL;AAAA,UACA;AAAA,QACF;AAAA,MAAA;AAAA,IAEJ,KAAK;AACI,aAAA;AAAA,QACL,SAAS;AAAA,QACT,OAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MAAA;AAAA,EAEN;AAEA,UAAQD,GAAkB;AAAA,IACxB,KAAK;AACI,aAAA;AAAA,QACL,SAAS;AAAA,QACT,OAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MAAA;AAAA,IAEJ,KAAK;AACI,aAAA;AAAA,QACL,SAAS;AAAA,QACT,OAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MAAA;AAAA,IAEJ,KAAK;AACI,aAAA;AAAA,QACL,SAAS;AAAA,QACT,OAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MAAA;AAAA,IAEJ,KAAK;AACI,aAAA;AAAA,QACL,SAAS;AAAA,QACT,OAAO;AAAA,UACL;AAAA,UACA;AAAA,QACF;AAAA,MAAA;AAAA,IAEJ,KAAK;AACI,aAAA;AAAA,QACL,SAAS;AAAA,QACT,OAAO,CAAC,qDAAqD;AAAA,MAAA;AAAA,EAEnE;AACF;"}
@@ -1,144 +1,78 @@
1
- import { useState as v, useRef as b, useCallback as P, useEffect as D } from "react";
2
- import G from "../../../hooks/use-cancellable-promise.js";
3
- import { removeTracksFromStream as k, openMediaDevices as L, getTrack as C, getConnectedDevices as p } from "../helper.js";
4
- const x = (_, r) => {
5
- const [l, f] = v("PROCESSING"), [w, m] = v("PROCESSING"), [I, R] = v(), [Y, g] = v(), [M, T] = v(), a = b(void 0), [u, h] = v({
1
+ import { useMediaManager as w } from "@cuemath/av";
2
+ import { useState as a, useCallback as n, useEffect as v } from "react";
3
+ const E = (c, o) => {
4
+ const [u, A] = a(), [d, _] = a(), [g, D] = a(), [S, m] = a(), [h, l] = a({
6
5
  audio: [],
7
6
  video: [],
8
7
  audioOutput: []
9
- }), [S, O] = v(), [y, A] = v(), d = G(), s = P(
10
- async (e, o) => {
11
- var n;
12
- a.current && k(a.current, o);
13
- const i = o === "audio" ? { audio: e ? { deviceId: e } : !0 } : { video: e ? { deviceId: e } : !0 };
14
- o === "audio" ? (O(e), f("PROCESSING"), R(void 0)) : o === "video" && (A(e), m("PROCESSING"), g(void 0));
15
- try {
16
- const t = await d(L(i, r)), c = C(t, o);
17
- c && (a.current ? (n = a.current) == null || n.addTrack(c) : a.current = t, c.addEventListener("ended", () => {
18
- o === "audio" ? s(void 0, "audio") : o === "video" && s(void 0, "video");
19
- }), o === "audio" ? (O(c.getSettings().deviceId), f("READY")) : o === "video" && (A(c.getSettings().deviceId), m("READY")));
20
- } catch (t) {
21
- const c = t instanceof Error ? t.message : "other";
22
- o === "audio" ? (f("ERROR"), R(c)) : o === "video" && (m("ERROR"), g(c));
8
+ }), [M, O] = a(), i = w(), p = n(
9
+ (e, t) => {
10
+ o("av_preview_error", { error: e }), t === "microphone" ? A(e) : t === "camera" && _(e);
11
+ },
12
+ [o]
13
+ ), f = n(() => {
14
+ const { audioDeviceId: e, videoDeviceId: t } = i.getSelectedDeviceDetails();
15
+ D(e), m(t);
16
+ }, [i]), r = n(
17
+ (e) => {
18
+ l(e || i.getAvailableDevices()), f();
19
+ },
20
+ [f, i]
21
+ );
22
+ v(() => (i.addDevicesChangeListener(r), () => {
23
+ i.addDevicesChangeListener(void 0);
24
+ }), [i, r]), v(() => {
25
+ !u && !d && c.current;
26
+ }), v(() => {
27
+ async function e() {
28
+ if (!u || !d) {
29
+ const t = await i.initializeUserMedia({
30
+ onError: p,
31
+ constraints: { audio: !0, video: !0 }
32
+ });
33
+ r(), c.current && t && (c.current.srcObject = t);
23
34
  }
35
+ }
36
+ e();
37
+ }, [
38
+ u,
39
+ i,
40
+ p,
41
+ r,
42
+ d,
43
+ c
44
+ ]);
45
+ const b = n(
46
+ async (e, t) => {
47
+ !i || !e || (i.changeSelectedDevice(e, t), t === "video" ? m(e) : t === "audio" && D(e));
24
48
  },
25
- [d, r]
26
- ), V = P(
49
+ [i]
50
+ ), k = n(
27
51
  (e) => {
28
- T(e);
29
- const o = _.current;
30
- o && "setSinkId" in o && o.setSinkId(e).catch((i) => {
31
- r("av_preview_set_audio_output_device_error", {
52
+ i.setAudioOutputDevice(e), O(e);
53
+ const t = c.current;
54
+ t && "setSinkId" in t && t.setSinkId(e).catch((s) => {
55
+ o("av_preview_set_audio_output_device_error", {
32
56
  deviceId: e,
33
- error_name: i == null ? void 0 : i.name,
34
- error_message: i == null ? void 0 : i.message
57
+ error_name: s == null ? void 0 : s.name,
58
+ error_message: s == null ? void 0 : s.message
35
59
  });
36
60
  });
37
61
  },
38
- [_, r]
62
+ [c, i, o]
39
63
  );
40
- return D(() => {
41
- let e;
42
- return (async () => {
43
- try {
44
- const i = await d(
45
- L({ video: !0, audio: !0 }, r)
46
- );
47
- a.current = i, f("READY"), m("READY");
48
- const n = C(i, "audio"), t = C(i, "video");
49
- n && (n.addEventListener("ended", () => {
50
- const c = n.getSettings().deviceId;
51
- c && s(c, "audio");
52
- }), O(n.getSettings().deviceId)), t && (t.addEventListener("ended", () => {
53
- const c = t.getSettings().deviceId;
54
- c && s(c, "video");
55
- }), A(t.getSettings().deviceId));
56
- try {
57
- const c = await d(p());
58
- h(c);
59
- } catch {
60
- r("av_preview_get_connected_devices_error");
61
- }
62
- } catch (i) {
63
- const n = i instanceof Error ? i.message : "other";
64
- try {
65
- const t = await d(p());
66
- t.audio.length + t.video.length === 0 ? (f("ERROR"), m("ERROR"), R(n), g(n)) : t.video.length === 0 ? (m("ERROR"), g(n)) : t.audio.length === 0 && (f("ERROR"), R(n)), t.audio.length > 0 && s(void 0, "audio"), t.video.length > 0 && s(void 0, "video"), h(t);
67
- } catch {
68
- r("av_preview_get_connected_devices_error");
69
- }
70
- }
71
- try {
72
- const i = await navigator.permissions.query({
73
- name: "camera"
74
- }), n = await navigator.permissions.query({
75
- name: "microphone"
76
- }), t = async () => {
77
- try {
78
- const E = await d(p());
79
- h(E);
80
- } catch {
81
- r("av_preview_get_connected_devices_error");
82
- }
83
- i.state === "granted" && s(void 0, "video");
84
- }, c = async () => {
85
- try {
86
- const E = await d(p());
87
- h(E);
88
- } catch {
89
- r("av_preview_get_connected_devices_error");
90
- }
91
- n.state === "granted" && s(void 0, "audio");
92
- };
93
- i.addEventListener("change", t), n.addEventListener("change", c), e = () => {
94
- i.removeEventListener("change", t), n.removeEventListener("change", c);
95
- };
96
- } catch {
97
- r("av_preview_permissions_query_error");
98
- }
99
- })(), () => {
100
- e && e();
101
- };
102
- }, [d, s, r]), D(() => {
103
- const e = async () => {
104
- try {
105
- const o = await p();
106
- h(o);
107
- } catch {
108
- r("av_preview_get_connected_devices_error");
109
- }
110
- };
111
- return navigator.mediaDevices.addEventListener("devicechange", e), () => {
112
- navigator.mediaDevices.removeEventListener("devicechange", e);
113
- };
114
- }, [r]), D(() => {
115
- if (l === "READY" && S && !u.audio.find((e) => e.id === S)) {
116
- const e = u.audio[0];
117
- e && s(e.id, "audio");
118
- }
119
- }, [l, s, u.audio, S]), D(() => {
120
- if (w === "READY" && y && !u.video.find((e) => e.id === y)) {
121
- const e = u.video[0];
122
- e && s(e.id, "video");
123
- }
124
- }, [w, s, u.video, y]), D(() => {
125
- a.current && _.current && (_.current.srcObject = a.current);
126
- }, [a.current, _]), D(() => () => {
127
- a.current && k(a.current);
128
- }, []), {
129
- audioDeviceStatus: l,
130
- audioDeviceError: I,
131
- videoDeviceStatus: w,
132
- videoDeviceError: Y,
133
- devices: u,
134
- selectedVideoDevice: y,
135
- selectedAudioDevice: S,
64
+ return {
65
+ audioDeviceError: u,
66
+ videoDeviceError: d,
67
+ devices: h,
68
+ selectedVideoDevice: S,
69
+ selectedAudioDevice: g,
136
70
  selectedAudioOutputDevice: M,
137
- changeDevice: s,
138
- changeAudioOutputDevice: V
71
+ changeDevice: b,
72
+ changeAudioOutputDevice: k
139
73
  };
140
74
  };
141
75
  export {
142
- x as default
76
+ E as default
143
77
  };
144
78
  //# sourceMappingURL=use-media-devices.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-media-devices.js","sources":["../../../../../src/features/av/av-preview/hooks/use-media-devices.ts"],"sourcesContent":["import type { RefObject } from 'react';\nimport { useCallback, useEffect, useRef, useState } from 'react';\n\nimport useCancellablePromise from '../../../hooks/use-cancellable-promise';\nimport type {\n IDevicesMap,\n ILogger,\n TDeviceError,\n TDeviceStatus,\n TMediaKind,\n} from '../av-preview-types';\nimport { getConnectedDevices, getTrack, openMediaDevices, removeTracksFromStream } from '../helper';\n\ninterface IChangeDevice {\n (deviceId: string | undefined, kind: TMediaKind): void;\n}\n\ninterface IUseMediaDevices {\n (\n videoElRef: RefObject<HTMLVideoElement | null>,\n logger: ILogger,\n ): {\n audioDeviceStatus: TDeviceStatus;\n audioDeviceError?: TDeviceError;\n videoDeviceStatus: TDeviceStatus;\n videoDeviceError?: TDeviceError;\n devices: IDevicesMap;\n selectedAudioDevice?: string;\n selectedVideoDevice?: string;\n selectedAudioOutputDevice?: string;\n changeDevice: IChangeDevice;\n changeAudioOutputDevice: (deviceId: string) => void;\n };\n}\n\nconst useMediaDevices: IUseMediaDevices = (videoElRef, logger) => {\n const [audioDeviceStatus, setAudioDeviceStatus] = useState<TDeviceStatus>('PROCESSING');\n const [videoDeviceStatus, setVideoDeviceStatus] = useState<TDeviceStatus>('PROCESSING');\n const [audioDeviceError, setAudioDeviceError] = useState<TDeviceError>();\n const [videoDeviceError, setVideoDeviceError] = useState<TDeviceError>();\n const [selectedAudioOutputDevice, setSelectedAudioOutputDevice] = useState<string>();\n\n const avStreamRef = useRef<MediaStream>(undefined);\n const [devices, setDevices] = useState<IDevicesMap>({\n audio: [],\n video: [],\n audioOutput: [],\n });\n const [selectedAudioDevice, setAudioDevice] = useState<string>();\n const [selectedVideoDevice, setVideoDevice] = useState<string>();\n const cancellablePromise = useCancellablePromise();\n\n const changeDevice = useCallback<IChangeDevice>(\n async (deviceId, deviceKind) => {\n if (avStreamRef.current) {\n removeTracksFromStream(avStreamRef.current, deviceKind);\n }\n\n const constraints: MediaStreamConstraints =\n deviceKind === 'audio'\n ? { audio: deviceId ? { deviceId } : true }\n : { video: deviceId ? { deviceId } : true };\n\n if (deviceKind === 'audio') {\n setAudioDevice(deviceId);\n setAudioDeviceStatus('PROCESSING');\n setAudioDeviceError(undefined);\n } else if (deviceKind === 'video') {\n setVideoDevice(deviceId);\n setVideoDeviceStatus('PROCESSING');\n setVideoDeviceError(undefined);\n }\n\n try {\n const stream = await cancellablePromise(openMediaDevices(constraints, logger));\n const track = getTrack(stream, deviceKind);\n\n if (track) {\n if (avStreamRef.current) {\n avStreamRef.current?.addTrack(track);\n } else {\n avStreamRef.current = stream;\n }\n\n track.addEventListener('ended', () => {\n if (deviceKind === 'audio') {\n changeDevice(undefined, 'audio');\n } else if (deviceKind === 'video') {\n changeDevice(undefined, 'video');\n }\n });\n\n if (deviceKind === 'audio') {\n setAudioDevice(track.getSettings().deviceId);\n setAudioDeviceStatus('READY');\n } else if (deviceKind === 'video') {\n setVideoDevice(track.getSettings().deviceId);\n setVideoDeviceStatus('READY');\n }\n }\n } catch (error) {\n const errorMessage: TDeviceError =\n error instanceof Error ? (error.message as TDeviceError) : 'other';\n\n if (deviceKind === 'audio') {\n setAudioDeviceStatus('ERROR');\n setAudioDeviceError(errorMessage);\n } else if (deviceKind === 'video') {\n setVideoDeviceStatus('ERROR');\n setVideoDeviceError(errorMessage);\n }\n }\n },\n [cancellablePromise, logger],\n );\n\n const changeAudioOutputDevice = useCallback(\n (deviceId: string) => {\n setSelectedAudioOutputDevice(deviceId);\n const videoEl = videoElRef.current;\n\n if (videoEl && 'setSinkId' in videoEl) {\n videoEl.setSinkId(deviceId).catch(error => {\n logger('av_preview_set_audio_output_device_error', {\n deviceId,\n error_name: error?.name,\n error_message: error?.message,\n });\n });\n }\n },\n [videoElRef, logger],\n );\n\n useEffect(() => {\n let permissionCleanup: (() => void) | undefined;\n const asyncEffect = async () => {\n try {\n const stream = await cancellablePromise(\n openMediaDevices({ video: true, audio: true }, logger),\n );\n\n avStreamRef.current = stream;\n setAudioDeviceStatus('READY');\n setVideoDeviceStatus('READY');\n const audioTrack = getTrack(stream, 'audio');\n const videoTrack = getTrack(stream, 'video');\n\n if (audioTrack) {\n audioTrack.addEventListener('ended', () => {\n const audioDeviceId = audioTrack.getSettings().deviceId;\n\n if (audioDeviceId) {\n changeDevice(audioDeviceId, 'audio');\n }\n });\n setAudioDevice(audioTrack.getSettings().deviceId);\n }\n\n if (videoTrack) {\n videoTrack.addEventListener('ended', () => {\n const videoDeviceId = videoTrack.getSettings().deviceId;\n\n if (videoDeviceId) {\n changeDevice(videoDeviceId, 'video');\n }\n });\n setVideoDevice(videoTrack.getSettings().deviceId);\n }\n\n try {\n const connectedDevices = await cancellablePromise(getConnectedDevices());\n\n setDevices(connectedDevices);\n } catch (error) {\n logger('av_preview_get_connected_devices_error');\n }\n } catch (error) {\n const errorMessage: TDeviceError =\n error instanceof Error ? (error.message as TDeviceError) : 'other';\n\n try {\n const connectedDevices = await cancellablePromise(getConnectedDevices());\n\n // Permission denied for\n if (connectedDevices.audio.length + connectedDevices.video.length === 0) {\n setAudioDeviceStatus('ERROR');\n setVideoDeviceStatus('ERROR');\n setAudioDeviceError(errorMessage);\n setVideoDeviceError(errorMessage);\n } else if (connectedDevices.video.length === 0) {\n setVideoDeviceStatus('ERROR');\n setVideoDeviceError(errorMessage);\n } else if (connectedDevices.audio.length === 0) {\n setAudioDeviceStatus('ERROR');\n setAudioDeviceError(errorMessage);\n }\n\n if (connectedDevices.audio.length > 0) {\n changeDevice(undefined, 'audio');\n }\n\n if (connectedDevices.video.length > 0) {\n changeDevice(undefined, 'video');\n }\n\n setDevices(connectedDevices);\n } catch (err) {\n logger('av_preview_get_connected_devices_error');\n }\n }\n\n try {\n const cameraPermission = await navigator.permissions.query({\n name: 'camera' as PermissionName,\n });\n const microphonePermission = await navigator.permissions.query({\n name: 'microphone' as PermissionName,\n });\n const handleCameraPermissionChange = async () => {\n try {\n const connectedDevices = await cancellablePromise(getConnectedDevices());\n\n setDevices(connectedDevices);\n } catch (error) {\n logger('av_preview_get_connected_devices_error');\n }\n\n if (cameraPermission.state === 'granted') {\n changeDevice(undefined, 'video'); // Reset video device on permission change\n }\n };\n const handleMicrophonePermissionChange = async () => {\n try {\n const connectedDevices = await cancellablePromise(getConnectedDevices());\n\n setDevices(connectedDevices);\n } catch (error) {\n logger('av_preview_get_connected_devices_error');\n }\n\n if (microphonePermission.state === 'granted') {\n changeDevice(undefined, 'audio'); // Reset audio device on permission change\n }\n };\n\n cameraPermission.addEventListener('change', handleCameraPermissionChange);\n microphonePermission.addEventListener('change', handleMicrophonePermissionChange);\n\n permissionCleanup = () => {\n cameraPermission.removeEventListener('change', handleCameraPermissionChange);\n microphonePermission.removeEventListener('change', handleMicrophonePermissionChange);\n };\n } catch (error) {\n logger('av_preview_permissions_query_error');\n }\n };\n\n asyncEffect();\n\n return () => {\n if (permissionCleanup) {\n permissionCleanup();\n }\n };\n }, [cancellablePromise, changeDevice, logger]);\n\n /**\n * Effect to handle media device changes\n * It listens for device changes and updates the list of connected devices.\n */\n useEffect(() => {\n const handleDeviceChange = async () => {\n try {\n const updatedDevices = await getConnectedDevices();\n\n setDevices(updatedDevices);\n } catch (error) {\n logger('av_preview_get_connected_devices_error');\n }\n };\n\n navigator.mediaDevices.addEventListener('devicechange', handleDeviceChange);\n\n return () => {\n navigator.mediaDevices.removeEventListener('devicechange', handleDeviceChange);\n };\n }, [logger]);\n\n /**\n * If the audio device is ready and the selected audio device is not in the list of available devices,\n * switch to the first available audio device.\n */\n useEffect(() => {\n if (\n audioDeviceStatus === 'READY' &&\n selectedAudioDevice &&\n !devices.audio.find(d => d.id === selectedAudioDevice)\n ) {\n const firstAudioDevice = devices.audio[0];\n\n if (firstAudioDevice) {\n changeDevice(firstAudioDevice.id, 'audio');\n }\n }\n }, [audioDeviceStatus, changeDevice, devices.audio, selectedAudioDevice]);\n\n /**\n * If the video device is ready and the selected video device is not in the list of available devices,\n * switch to the first available video device.\n */\n useEffect(() => {\n if (\n videoDeviceStatus === 'READY' &&\n selectedVideoDevice &&\n !devices.video.find(d => d.id === selectedVideoDevice)\n ) {\n const firstVideoDevice = devices.video[0];\n\n if (firstVideoDevice) {\n changeDevice(firstVideoDevice.id, 'video');\n }\n }\n }, [videoDeviceStatus, changeDevice, devices.video, selectedVideoDevice]);\n\n // Set the video element's srcObject to the MediaStream when available\n useEffect(() => {\n if (avStreamRef.current && videoElRef.current) {\n videoElRef.current.srcObject = avStreamRef.current;\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [avStreamRef.current, videoElRef]);\n\n useEffect(() => {\n return () => {\n if (avStreamRef.current) {\n removeTracksFromStream(avStreamRef.current);\n }\n };\n }, []);\n\n return {\n audioDeviceStatus,\n audioDeviceError,\n videoDeviceStatus,\n videoDeviceError,\n devices,\n selectedVideoDevice,\n selectedAudioDevice,\n selectedAudioOutputDevice,\n changeDevice,\n changeAudioOutputDevice,\n };\n};\n\nexport default useMediaDevices;\n"],"names":["useMediaDevices","videoElRef","logger","audioDeviceStatus","setAudioDeviceStatus","useState","videoDeviceStatus","setVideoDeviceStatus","audioDeviceError","setAudioDeviceError","videoDeviceError","setVideoDeviceError","selectedAudioOutputDevice","setSelectedAudioOutputDevice","avStreamRef","useRef","devices","setDevices","selectedAudioDevice","setAudioDevice","selectedVideoDevice","setVideoDevice","cancellablePromise","useCancellablePromise","changeDevice","useCallback","deviceId","deviceKind","removeTracksFromStream","constraints","stream","openMediaDevices","track","getTrack","_a","error","errorMessage","changeAudioOutputDevice","videoEl","useEffect","permissionCleanup","audioTrack","videoTrack","audioDeviceId","videoDeviceId","connectedDevices","getConnectedDevices","cameraPermission","microphonePermission","handleCameraPermissionChange","handleMicrophonePermissionChange","handleDeviceChange","updatedDevices","d","firstAudioDevice","firstVideoDevice"],"mappings":"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"}
1
+ {"version":3,"file":"use-media-devices.js","sources":["../../../../../src/features/av/av-preview/hooks/use-media-devices.ts"],"sourcesContent":["import { useMediaManager } from '@cuemath/av';\nimport {\n type IDevicesMap,\n type TDeviceError,\n type TDisplayDeviceError,\n} from '@cuemath/av/dist/types';\nimport type { RefObject } from 'react';\nimport { useCallback, useEffect, useState } from 'react';\n\nimport type { ILogger, TMediaKind } from '../av-preview-types';\n\ninterface IChangeDevice {\n (deviceId: string | undefined, kind: TMediaKind): void;\n}\n\ninterface IUseMediaDevices {\n (\n videoElRef: RefObject<HTMLVideoElement | null>,\n logger: ILogger,\n ): {\n audioDeviceError?: TDeviceError;\n videoDeviceError?: TDeviceError;\n devices: IDevicesMap;\n selectedAudioDevice?: string;\n selectedVideoDevice?: string;\n selectedAudioOutputDevice?: string;\n changeDevice: IChangeDevice;\n changeAudioOutputDevice: (deviceId: string) => void;\n };\n}\n\nconst useMediaDevices: IUseMediaDevices = (videoElRef, logger) => {\n const [audioDeviceError, setAudioDeviceError] = useState<TDeviceError>();\n const [videoDeviceError, setVideoDeviceError] = useState<TDeviceError>();\n const [selectedAudioDevice, setAudioDevice] = useState<string>();\n const [selectedVideoDevice, setVideoDevice] = useState<string>();\n const [devices, setDevices] = useState<IDevicesMap>({\n audio: [],\n video: [],\n audioOutput: [],\n });\n const [selectedAudioOutputDevice, setSelectedAudioOutputDevice] = useState<string>();\n\n const mediaManager = useMediaManager();\n\n const onError = useCallback(\n (\n error: TDeviceError | TDisplayDeviceError | undefined,\n type: 'camera' | 'microphone' | 'screen',\n ) => {\n logger('av_preview_error', { error });\n if (type === 'microphone') {\n setAudioDeviceError(error as TDeviceError);\n } else if (type === 'camera') {\n setVideoDeviceError(error as TDeviceError);\n }\n },\n [logger],\n );\n const getAndUpdateSelectedDevices = useCallback(() => {\n const { audioDeviceId, videoDeviceId } = mediaManager.getSelectedDeviceDetails();\n\n setAudioDevice(audioDeviceId);\n setVideoDevice(videoDeviceId);\n }, [mediaManager]);\n\n const updateAvailableDevices = useCallback(\n (updatedDevices?: IDevicesMap) => {\n if (updatedDevices) {\n setDevices(updatedDevices);\n } else {\n setDevices(mediaManager.getAvailableDevices());\n }\n getAndUpdateSelectedDevices();\n },\n [getAndUpdateSelectedDevices, mediaManager],\n );\n\n useEffect(() => {\n mediaManager.addDevicesChangeListener(updateAvailableDevices);\n\n return () => {\n mediaManager.addDevicesChangeListener(undefined);\n };\n }, [mediaManager, updateAvailableDevices]);\n\n useEffect(() => {\n if (!audioDeviceError && !videoDeviceError && videoElRef.current) {\n }\n });\n\n useEffect(() => {\n async function getStreamFromMediaManager() {\n if (!audioDeviceError || !videoDeviceError) {\n const stream = await mediaManager.initializeUserMedia({\n onError,\n constraints: { audio: true, video: true },\n });\n\n updateAvailableDevices();\n\n if (videoElRef.current && stream) {\n videoElRef.current.srcObject = stream;\n }\n }\n }\n getStreamFromMediaManager();\n }, [\n audioDeviceError,\n mediaManager,\n onError,\n updateAvailableDevices,\n videoDeviceError,\n videoElRef,\n ]);\n\n const changeDevice = useCallback<IChangeDevice>(\n async (deviceId, deviceKind) => {\n if (!mediaManager || !deviceId) return;\n\n mediaManager.changeSelectedDevice(deviceId, deviceKind);\n if (deviceKind === 'video') {\n setVideoDevice(deviceId);\n } else if (deviceKind === 'audio') {\n setAudioDevice(deviceId);\n }\n },\n [mediaManager],\n );\n\n const changeAudioOutputDevice = useCallback(\n (deviceId: string) => {\n mediaManager.setAudioOutputDevice(deviceId);\n\n setSelectedAudioOutputDevice(deviceId);\n const videoEl = videoElRef.current;\n\n if (videoEl && 'setSinkId' in videoEl) {\n videoEl.setSinkId(deviceId).catch(error => {\n logger('av_preview_set_audio_output_device_error', {\n deviceId,\n error_name: error?.name,\n error_message: error?.message,\n });\n });\n }\n },\n [videoElRef, mediaManager, logger],\n );\n\n return {\n audioDeviceError,\n videoDeviceError,\n devices,\n selectedVideoDevice,\n selectedAudioDevice,\n selectedAudioOutputDevice,\n changeDevice,\n changeAudioOutputDevice,\n };\n};\n\nexport default useMediaDevices;\n"],"names":["useMediaDevices","videoElRef","logger","audioDeviceError","setAudioDeviceError","useState","videoDeviceError","setVideoDeviceError","selectedAudioDevice","setAudioDevice","selectedVideoDevice","setVideoDevice","devices","setDevices","selectedAudioOutputDevice","setSelectedAudioOutputDevice","mediaManager","useMediaManager","onError","useCallback","error","type","getAndUpdateSelectedDevices","audioDeviceId","videoDeviceId","updateAvailableDevices","updatedDevices","useEffect","getStreamFromMediaManager","stream","changeDevice","deviceId","deviceKind","changeAudioOutputDevice","videoEl"],"mappings":"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"}