diff --git a/public/assets/icons/IcAdd.svg b/public/assets/icons/IcAdd.svg new file mode 100644 index 00000000..1b869876 --- /dev/null +++ b/public/assets/icons/IcAdd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/assets/icons/IcChevronRightBold.svg b/public/assets/icons/IcChevronRightBold.svg new file mode 100644 index 00000000..2b01f092 --- /dev/null +++ b/public/assets/icons/IcChevronRightBold.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/assets/icons/IcCloseCircle.svg b/public/assets/icons/IcCloseCircle.svg new file mode 100644 index 00000000..09e119a6 --- /dev/null +++ b/public/assets/icons/IcCloseCircle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/assets/icons/IcDbotClose.svg b/public/assets/icons/IcDbotClose.svg new file mode 100644 index 00000000..4aacd05e --- /dev/null +++ b/public/assets/icons/IcDbotClose.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/assets/icons/IcDbotNoSearchResult.svg b/public/assets/icons/IcDbotNoSearchResult.svg new file mode 100644 index 00000000..8e544db5 --- /dev/null +++ b/public/assets/icons/IcDbotNoSearchResult.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/assets/icons/IcGoogleDrive.svg b/public/assets/icons/IcGoogleDriveDbot.svg similarity index 100% rename from public/assets/icons/IcGoogleDrive.svg rename to public/assets/icons/IcGoogleDriveDbot.svg diff --git a/public/assets/icons/IcMinus.svg b/public/assets/icons/IcMinus.svg new file mode 100644 index 00000000..32b25624 --- /dev/null +++ b/public/assets/icons/IcMinus.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/assets/icons/IcPlayOutline.svg b/public/assets/icons/IcPlayOutline.svg new file mode 100644 index 00000000..a2f45e75 --- /dev/null +++ b/public/assets/icons/IcPlayOutline.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/assets/icons/IcBlockly.svg b/public/assets/icons/IcQuickStrategy.svg similarity index 100% rename from public/assets/icons/IcBlockly.svg rename to public/assets/icons/IcQuickStrategy.svg diff --git a/public/assets/images/1-3-2-6.svg b/public/assets/images/1-3-2-6.svg new file mode 100644 index 00000000..90d9e0b5 --- /dev/null +++ b/public/assets/images/1-3-2-6.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/assets/images/blocks_menu.png b/public/assets/images/blocks_menu.png new file mode 100644 index 00000000..9d9540f4 Binary files /dev/null and b/public/assets/images/blocks_menu.png differ diff --git a/public/assets/images/blocks_menu_search.png b/public/assets/images/blocks_menu_search.png new file mode 100644 index 00000000..cbcf3c83 Binary files /dev/null and b/public/assets/images/blocks_menu_search.png differ diff --git a/public/assets/images/bot-builder-tour.png b/public/assets/images/bot-builder-tour.png new file mode 100644 index 00000000..bb481f1d Binary files /dev/null and b/public/assets/images/bot-builder-tour.png differ diff --git a/public/assets/images/build_a_bot.png b/public/assets/images/build_a_bot.png new file mode 100644 index 00000000..5db94ac5 Binary files /dev/null and b/public/assets/images/build_a_bot.png differ diff --git a/public/assets/images/dalembert.svg b/public/assets/images/dalembert.svg new file mode 100644 index 00000000..60b53482 --- /dev/null +++ b/public/assets/images/dalembert.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/assets/images/dalembert_formula_1.svg b/public/assets/images/dalembert_formula_1.svg new file mode 100644 index 00000000..b3714de0 --- /dev/null +++ b/public/assets/images/dalembert_formula_1.svg @@ -0,0 +1 @@ +BR-1s R+Rf*2 \ No newline at end of file diff --git a/public/assets/images/dalembert_formula_2.svg b/public/assets/images/dalembert_formula_2.svg new file mode 100644 index 00000000..e2bbe300 --- /dev/null +++ b/public/assets/images/dalembert_formula_2.svg @@ -0,0 +1 @@ +100R-1s R+R2*2 \ No newline at end of file diff --git a/public/assets/images/dalembert_formula_dark_1.svg b/public/assets/images/dalembert_formula_dark_1.svg new file mode 100644 index 00000000..aab6854b --- /dev/null +++ b/public/assets/images/dalembert_formula_dark_1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/assets/images/dalembert_formula_dark_2.svg b/public/assets/images/dalembert_formula_dark_2.svg new file mode 100644 index 00000000..30e9b85c --- /dev/null +++ b/public/assets/images/dalembert_formula_dark_2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/assets/images/dbot-mobile-onboarding-step-2.png b/public/assets/images/dbot-mobile-onboarding-step-2.png new file mode 100644 index 00000000..d0a9b3e8 Binary files /dev/null and b/public/assets/images/dbot-mobile-onboarding-step-2.png differ diff --git a/public/assets/images/dbot-mobile-onboarding-step-4.png b/public/assets/images/dbot-mobile-onboarding-step-4.png new file mode 100644 index 00000000..3aa62470 Binary files /dev/null and b/public/assets/images/dbot-mobile-onboarding-step-4.png differ diff --git a/public/assets/images/dbot-mobile-onboarding-step-7.png b/public/assets/images/dbot-mobile-onboarding-step-7.png new file mode 100644 index 00000000..a9b712b4 Binary files /dev/null and b/public/assets/images/dbot-mobile-onboarding-step-7.png differ diff --git a/public/assets/images/dbot-onboard-tour copy.png b/public/assets/images/dbot-onboard-tour copy.png new file mode 100644 index 00000000..5f5809c2 Binary files /dev/null and b/public/assets/images/dbot-onboard-tour copy.png differ diff --git a/public/assets/images/dbot-onboard-tour.png b/public/assets/images/dbot-onboard-tour.png new file mode 100644 index 00000000..5f5809c2 Binary files /dev/null and b/public/assets/images/dbot-onboard-tour.png differ diff --git a/public/assets/images/how_to_use_martingale copy.jpg b/public/assets/images/how_to_use_martingale copy.jpg new file mode 100644 index 00000000..46abfb7a Binary files /dev/null and b/public/assets/images/how_to_use_martingale copy.jpg differ diff --git a/public/assets/images/how_to_use_martingale.jpg b/public/assets/images/how_to_use_martingale.jpg new file mode 100644 index 00000000..46abfb7a Binary files /dev/null and b/public/assets/images/how_to_use_martingale.jpg differ diff --git a/public/assets/images/intro_to_deriv_bot copy.png b/public/assets/images/intro_to_deriv_bot copy.png new file mode 100644 index 00000000..bdf5de09 Binary files /dev/null and b/public/assets/images/intro_to_deriv_bot copy.png differ diff --git a/public/assets/images/intro_to_deriv_bot.png b/public/assets/images/intro_to_deriv_bot.png new file mode 100644 index 00000000..bdf5de09 Binary files /dev/null and b/public/assets/images/intro_to_deriv_bot.png differ diff --git a/public/assets/images/loss_control_all_block.png b/public/assets/images/loss_control_all_block.png new file mode 100644 index 00000000..de0391a0 Binary files /dev/null and b/public/assets/images/loss_control_all_block.png differ diff --git a/public/assets/images/loss_control_purchase_conditions.png b/public/assets/images/loss_control_purchase_conditions.png new file mode 100644 index 00000000..65ec00aa Binary files /dev/null and b/public/assets/images/loss_control_purchase_conditions.png differ diff --git a/public/assets/images/loss_control_restart_trade_conditions.png b/public/assets/images/loss_control_restart_trade_conditions.png new file mode 100644 index 00000000..bf14db9c Binary files /dev/null and b/public/assets/images/loss_control_restart_trade_conditions.png differ diff --git a/public/assets/images/loss_control_set_current_stake.png b/public/assets/images/loss_control_set_current_stake.png new file mode 100644 index 00000000..71ab8ba9 Binary files /dev/null and b/public/assets/images/loss_control_set_current_stake.png differ diff --git a/public/assets/images/loss_control_set_stop_loss.png b/public/assets/images/loss_control_set_stop_loss.png new file mode 100644 index 00000000..d36151ef Binary files /dev/null and b/public/assets/images/loss_control_set_stop_loss.png differ diff --git a/public/assets/images/loss_control_trade_parameters.png b/public/assets/images/loss_control_trade_parameters.png new file mode 100644 index 00000000..581fadf7 Binary files /dev/null and b/public/assets/images/loss_control_trade_parameters.png differ diff --git a/public/assets/images/martingale.svg b/public/assets/images/martingale.svg new file mode 100644 index 00000000..cdf2ede0 --- /dev/null +++ b/public/assets/images/martingale.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/assets/images/martingale_formula_1.svg b/public/assets/images/martingale_formula_1.svg new file mode 100644 index 00000000..a6235234 --- /dev/null +++ b/public/assets/images/martingale_formula_1.svg @@ -0,0 +1 @@ +RlogBs( )logm( ) \ No newline at end of file diff --git a/public/assets/images/martingale_formula_2.svg b/public/assets/images/martingale_formula_2.svg new file mode 100644 index 00000000..fd4f599a --- /dev/null +++ b/public/assets/images/martingale_formula_2.svg @@ -0,0 +1 @@ +Rlog10001( )log2( ) \ No newline at end of file diff --git a/public/assets/images/martingale_formula_dark_1.svg b/public/assets/images/martingale_formula_dark_1.svg new file mode 100644 index 00000000..24dcde1e --- /dev/null +++ b/public/assets/images/martingale_formula_dark_1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/assets/images/martingale_formula_dark_2.svg b/public/assets/images/martingale_formula_dark_2.svg new file mode 100644 index 00000000..432267f3 --- /dev/null +++ b/public/assets/images/martingale_formula_dark_2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/assets/images/oscars_grind.png b/public/assets/images/oscars_grind.png new file mode 100644 index 00000000..3e9fbeb4 Binary files /dev/null and b/public/assets/images/oscars_grind.png differ diff --git a/public/assets/images/reset_transaction_log.png b/public/assets/images/reset_transaction_log.png new file mode 100644 index 00000000..604a1f1b Binary files /dev/null and b/public/assets/images/reset_transaction_log.png differ diff --git a/public/assets/images/reset_transaction_log_message.png b/public/assets/images/reset_transaction_log_message.png new file mode 100644 index 00000000..60a8dd08 Binary files /dev/null and b/public/assets/images/reset_transaction_log_message.png differ diff --git a/public/assets/images/reverse_dalembert.svg b/public/assets/images/reverse_dalembert.svg new file mode 100644 index 00000000..4de7c0fd --- /dev/null +++ b/public/assets/images/reverse_dalembert.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/assets/images/reverse_martingale.svg b/public/assets/images/reverse_martingale.svg new file mode 100644 index 00000000..1749cd35 --- /dev/null +++ b/public/assets/images/reverse_martingale.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/components/shared_ui/accordion/accordion.scss b/src/components/shared_ui/accordion/accordion.scss new file mode 100644 index 00000000..9d1dc66b --- /dev/null +++ b/src/components/shared_ui/accordion/accordion.scss @@ -0,0 +1,64 @@ +/* @define dc-accordion */ +.dc-accordion { + &__wrapper { + /* postcss-bem-linter: ignore */ + > div:last-child { + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; + border-bottom-width: 1px; + } + } + + &__item { + border: 1px solid var(--general-section-1); + border-bottom-width: 0; + color: var(--text-general); + font-size: 1.4rem; + + &--first { + border-top-right-radius: 4px; + border-top-left-radius: 4px; + } + + &--open { + .dc-accordion__item-header { + border-bottom: 1px solid var(--general-section-1); + } + + .dc-accordion__item-content { + display: block; + } + } + + &--close { + .dc-accordion__item-content { + display: none; + } + } + + &-header { + cursor: pointer; + line-height: 1.43; + padding: 8px 16px; + + &-icon { + vertical-align: middle; + + &-wrapper { + float: right; + padding-left: 16px; + } + + /* postcss-bem-linter: ignore */ + path, + rect { + fill: var(--text-general); + } + } + } + + &-content { + padding: 16px; + } + } +} diff --git a/src/components/shared_ui/accordion/accordion.tsx b/src/components/shared_ui/accordion/accordion.tsx new file mode 100644 index 00000000..ff9ea6c3 --- /dev/null +++ b/src/components/shared_ui/accordion/accordion.tsx @@ -0,0 +1,50 @@ +import React from 'react'; +import classNames from 'classnames'; +import { usePrevious } from '@/hooks/use-previous'; +import { Icon } from '@/utils/tmp/dummy'; +import { TAccordionProps } from '../types'; + +const Accordion = ({ className, icon_close, icon_open, list }: TAccordionProps) => { + const [open_idx, setOpenIdx] = React.useState(null); + + const prev_list = usePrevious(list); + + React.useEffect(() => { + if (prev_list !== list) setOpenIdx(null); + }, [list, prev_list]); + + // close if clicking the accordion that's open, otherwise open the new one + const onClick = (index: number) => setOpenIdx(index === open_idx ? null : index); + + return ( +
+ {list.map((item, idx) => ( +
+
onClick(idx)}> + {item.header} +
+ {open_idx === idx ? ( + + ) : ( + + )} +
+
+
{item.content}
+
+ ))} +
+ ); +}; + +export default Accordion; diff --git a/src/components/shared_ui/accordion/index.ts b/src/components/shared_ui/accordion/index.ts new file mode 100644 index 00000000..322dd20a --- /dev/null +++ b/src/components/shared_ui/accordion/index.ts @@ -0,0 +1,4 @@ +import Accordion from './accordion'; +import './accordion.scss'; + +export default Accordion; diff --git a/src/components/shared_ui/dialog/dialog.tsx b/src/components/shared_ui/dialog/dialog.tsx index 3def5d0c..07a6ad60 100644 --- a/src/components/shared_ui/dialog/dialog.tsx +++ b/src/components/shared_ui/dialog/dialog.tsx @@ -1,11 +1,9 @@ import React from 'react'; +import classNames from 'classnames'; import ReactDOM from 'react-dom'; import { CSSTransition } from 'react-transition-group'; -import classNames from 'classnames'; - import { useOnClickOutside } from '@/hooks/useOnClickOutside'; import { Icon } from '@/utils/tmp/dummy'; - import Button from '../button'; import Text from '../text'; diff --git a/src/components/shared_ui/dialog/index.ts b/src/components/shared_ui/dialog/index.ts index afccdee4..2a8bce6b 100644 --- a/src/components/shared_ui/dialog/index.ts +++ b/src/components/shared_ui/dialog/index.ts @@ -1,5 +1,4 @@ import Dialog from './dialog'; - import './dialog.scss'; export default Dialog; diff --git a/src/components/shared_ui/types/accordion.types.ts b/src/components/shared_ui/types/accordion.types.ts new file mode 100644 index 00000000..76b26d93 --- /dev/null +++ b/src/components/shared_ui/types/accordion.types.ts @@ -0,0 +1,11 @@ +export type TAccordionItem = Array<{ + header: string; + content: React.ReactNode; +}>; + +export type TAccordionProps = { + className?: string; + icon_close?: string; + icon_open?: string; + list: TAccordionItem; +}; diff --git a/src/components/shared_ui/types/common.types.ts b/src/components/shared_ui/types/common.types.ts new file mode 100644 index 00000000..91e588f5 --- /dev/null +++ b/src/components/shared_ui/types/common.types.ts @@ -0,0 +1,35 @@ +import React from 'react'; +import { getCardLabels, getContractTypeDisplay } from '@deriv/shared'; +import { TContractOptions } from '@deriv/shared/src/utils/contract/contract-types'; + +export type TGenericObjectType = { + [key: string]: React.ReactNode; +}; +export type TGetCardLables = () => ReturnType; + +export type TGetContractTypeDisplay = ( + type: string, + options: TContractOptions +) => ReturnType; + +export type TItem = { + id: string; + value: Array | string; +}; + +export type TTableRowItem = + | { + message?: string; + component?: React.ReactElement; + } + | string; + +export type TRow = { [key: string]: any }; + +export type TPassThrough = { isTopUp: (item: TRow) => boolean }; + +export type TDatePickerOnChangeEvent = { + date?: string; + duration?: number | null | string; + target?: { name?: string; value?: number | string | moment.Moment | null }; +}; diff --git a/src/components/shared_ui/types/contract.types.ts b/src/components/shared_ui/types/contract.types.ts new file mode 100644 index 00000000..090e2607 --- /dev/null +++ b/src/components/shared_ui/types/contract.types.ts @@ -0,0 +1,14 @@ +export type TGetContractPath = (contract_id?: number) => string; + +export type TToastConfig = { + key: string; + content: string | React.ReactNode; + is_bottom?: boolean; + timeout?: number; + type: string; +}; + +export type TErrorMessages = Readonly<{ + take_profit: string; + stop_loss: string; +}>; diff --git a/src/components/shared_ui/types/icons.types.ts b/src/components/shared_ui/types/icons.types.ts new file mode 100644 index 00000000..2b71182d --- /dev/null +++ b/src/components/shared_ui/types/icons.types.ts @@ -0,0 +1,37 @@ +import { MouseEventHandler } from 'react'; +import { TGenericObjectType } from './common.types'; + +export type TIconsManifest = Readonly<{ + // If a new icon category is added, be sure to add it here as well. This is part of the fix for ts(7053) + brand: string; + cashier: string; + common: string; + contract: string; + currency: string; + dxtrade: string; + flag: string; + mt5: string; + option: string; + stock: string; + tradetype: string; + underlying: string; + wallet: string; +}>; + +export type TIconProps = { + className?: string | TGenericObjectType; + color?: string; + custom_color?: string; + data_testid?: string; + height?: number | string; + icon: string; + onClick?: MouseEventHandler; + onMouseDown?: () => void; + onMouseEnter?: () => void; + onMouseLeave?: () => void; + onTouchStart?: () => void; + size?: number | string; + width?: number | string; + id?: string; + description?: string; +}; diff --git a/src/components/shared_ui/types/index.ts b/src/components/shared_ui/types/index.ts new file mode 100644 index 00000000..9fe3985f --- /dev/null +++ b/src/components/shared_ui/types/index.ts @@ -0,0 +1,22 @@ +import { TAccordionItem,TAccordionProps } from './accordion.types'; +import { TDatePickerOnChangeEvent,TGetCardLables, TGetContractTypeDisplay } from './common.types'; +import { TErrorMessages, TGetContractPath, TToastConfig } from './contract.types'; +import { TIconProps,TIconsManifest } from './icons.types'; +import { TMultiStepProps, TMultiStepRefProps } from './multi-step.types'; +import { TPopoverProps } from './popover.types'; + +export type { + TAccordionItem, + TAccordionProps, + TDatePickerOnChangeEvent, + TErrorMessages, + TGetCardLables, + TGetContractPath, + TGetContractTypeDisplay, + TIconProps, + TIconsManifest, + TMultiStepProps, + TMultiStepRefProps, + TPopoverProps, + TToastConfig, +}; diff --git a/src/components/shared_ui/types/multi-step.types.ts b/src/components/shared_ui/types/multi-step.types.ts new file mode 100644 index 00000000..34f12a02 --- /dev/null +++ b/src/components/shared_ui/types/multi-step.types.ts @@ -0,0 +1,13 @@ +import React from 'react'; + +export type TMultiStepRefProps = { + // TODO: Remove the type defined in MT5 and reference this one instead + goNextStep: () => void; + goPrevStep: () => void; +}; + +export type TMultiStepProps = { + className?: string; + lbl_previous?: string; + steps: Array<{ component: React.ReactElement }>; +}; diff --git a/src/components/shared_ui/types/popover.types.ts b/src/components/shared_ui/types/popover.types.ts new file mode 100644 index 00000000..f972527b --- /dev/null +++ b/src/components/shared_ui/types/popover.types.ts @@ -0,0 +1,29 @@ +import React from 'react'; +import { PopoverPosition } from 'react-tiny-popover'; + +export type TPopoverProps = { + alignment: PopoverPosition; + className?: string; + classNameBubble?: string; + classNameTarget?: string; + classNameTargetIcon?: string; + counter?: number; + disable_message_icon?: boolean; + disable_target_icon?: boolean; + has_error?: boolean; + icon?: 'info' | 'question' | 'dot' | 'counter'; + id?: string; + is_bubble_hover_enabled?: boolean; + is_open?: boolean; + relative_render?: boolean; + margin?: number; + message: React.ReactNode; + onBubbleOpen?: () => void; + onBubbleClose?: () => void; + onClick?: React.MouseEventHandler; + should_disable_pointer_events?: boolean; + should_show_cursor?: boolean; + zIndex?: string; + data_testid?: string; + arrow_styles?: React.CSSProperties; +}; diff --git a/src/hooks/use-previous.ts b/src/hooks/use-previous.ts new file mode 100644 index 00000000..e8d4d168 --- /dev/null +++ b/src/hooks/use-previous.ts @@ -0,0 +1,9 @@ +import React from 'react'; + +export const usePrevious = (value: T) => { + const ref = React.useRef(); + React.useEffect(() => { + ref.current = value; + }, [value]); + return ref.current; +}; diff --git a/src/pages/bot-builder/quick-strategy/form-wrappers/accordion-strategy-group.tsx b/src/pages/bot-builder/quick-strategy/form-wrappers/accordion-strategy-group.tsx index b97220d5..3e5d9d7e 100644 --- a/src/pages/bot-builder/quick-strategy/form-wrappers/accordion-strategy-group.tsx +++ b/src/pages/bot-builder/quick-strategy/form-wrappers/accordion-strategy-group.tsx @@ -13,20 +13,20 @@ type TAccordionStrategyGroupProps = { }; type TDescriptionContent = { - item: TDescriptionItem[]; + item: TDescriptionItem[] | string; font_size: string; }; -const DescriptionContent = ({ item, font_size }: TDescriptionContent) => { - const content_data: TDescriptionItem[] = Array.isArray(item) ? item : (item as TDescriptionItem[]).slice(1); - +export const DescriptionContent = ({ item, font_size }: TDescriptionContent) => { + const content_data: TDescriptionItem[] | string = Array.isArray(item) ? item : item.slice(1); return ( <> - {content_data?.map(item => ( - - - - ))} + {Array.isArray(content_data) && + content_data?.map(item => ( + + + + ))} ); }; @@ -39,11 +39,11 @@ const AccordionStrategyGroup = observer( setExpandedSubtitlesStorage, }: TAccordionStrategyGroupProps) => { const { ui } = useStore(); - const { is_mobile } = ui; + const { is_desktop } = ui; const desktop_font_size = tutorial_selected_strategy ? 's' : 'xs'; const font_size: string = React.useMemo( - () => (is_mobile ? 'xs' : desktop_font_size), - [is_mobile, desktop_font_size] + () => (is_desktop ? desktop_font_size : 'xs'), + [is_desktop, desktop_font_size] ); return ( diff --git a/src/pages/bot-builder/quick-strategy/form-wrappers/mobile-form-wrapper.tsx b/src/pages/bot-builder/quick-strategy/form-wrappers/mobile-form-wrapper.tsx index 6bcc873f..db3456ff 100644 --- a/src/pages/bot-builder/quick-strategy/form-wrappers/mobile-form-wrapper.tsx +++ b/src/pages/bot-builder/quick-strategy/form-wrappers/mobile-form-wrapper.tsx @@ -2,11 +2,12 @@ import React from 'react'; import classNames from 'classnames'; import { useFormikContext } from 'formik'; import { observer } from 'mobx-react-lite'; +import Button from '@/components/shared_ui/button'; import SelectNative from '@/components/shared_ui/select-native'; +import Text from '@/components/shared_ui/text'; import ThemedScrollbars from '@/components/shared_ui/themed-scrollbars'; import { useStore } from '@/hooks/useStore'; import { localize } from '@/utils/tmp/dummy'; -import { Button, Text } from '@deriv-com/ui'; import { rudderStackSendQsRunStrategyEvent, rudderStackSendQsSelectedTabEvent, diff --git a/src/pages/bot-builder/toolbar/toolbar-button.tsx b/src/pages/bot-builder/toolbar/toolbar-button.tsx index 9fe477cb..08814197 100644 --- a/src/pages/bot-builder/toolbar/toolbar-button.tsx +++ b/src/pages/bot-builder/toolbar/toolbar-button.tsx @@ -1,5 +1,5 @@ +import Button from '@/components/shared_ui/button'; import Popover from '@/components/shared_ui/popover'; -import { Button } from '@deriv-com/ui'; type TToolbarButton = { popover_message?: string; diff --git a/src/pages/bot-builder/toolbox/toolbox.tsx b/src/pages/bot-builder/toolbox/toolbox.tsx index 122ce888..833d71c9 100644 --- a/src/pages/bot-builder/toolbox/toolbox.tsx +++ b/src/pages/bot-builder/toolbox/toolbox.tsx @@ -1,9 +1,9 @@ import React from 'react'; import classNames from 'classnames'; import { observer } from 'mobx-react-lite'; +import Text from '@/components/shared_ui/text'; import { useStore } from '@/hooks/useStore'; import { Icon, localize } from '@/utils/tmp/dummy'; -import { Text } from '@deriv-com/ui'; import { rudderStackSendQsOpenEventFromBotBuilder } from '../quick-strategy/analytics/rudderstack-quick-strategy'; import ToolbarButton from '../toolbar/toolbar-button'; import SearchBox from './search-box'; diff --git a/src/pages/dashboard/cards.tsx b/src/pages/dashboard/cards.tsx index 61afa3b6..f6932539 100644 --- a/src/pages/dashboard/cards.tsx +++ b/src/pages/dashboard/cards.tsx @@ -2,17 +2,12 @@ import React from 'react'; import classNames from 'classnames'; import { observer } from 'mobx-react-lite'; -import { NOTIFICATION_TYPE } from '@/components/bot-notification/bot-notification-utils'; -import DesktopWrapper from '@/components/shared_ui/desktop-wrapper'; import Dialog from '@/components/shared_ui/dialog'; import MobileFullPageModal from '@/components/shared_ui/mobile-full-page-modal'; -import MobileWrapper from '@/components/shared_ui/mobile-wrapper'; import Text from '@/components/shared_ui/text'; import { DBOT_TABS } from '@/constants/bot-contents'; import { useStore } from '@/hooks/useStore'; -import { Icon } from '@/utils/tmp/dummy'; -import { localize } from '@deriv-com/translations'; -import { rudderStackSendQsOpenEventFromDashboard } from '../bot-builder/quick-strategy/analytics/rudderstack-quick-strategy'; +import { Icon, localize } from '@/utils/tmp/dummy'; import DashboardBotList from './load-bot-preview/dashboard-bot-list'; import GoogleDrive from './load-bot-preview/google-drive'; @@ -30,34 +25,22 @@ type TCardArray = { const Cards = observer(({ is_mobile, has_dashboard_strategies }: TCardProps) => { const { dashboard, load_modal, quick_strategy } = useStore(); - const { - onCloseDialog, - dialog_options, - is_dialog_open, - setActiveTab, - setFileLoaded, - setPreviewOnPopup, - setOpenSettings, - showVideoDialog, - } = dashboard; - const { handleFileChange, loadFileFromLocal } = load_modal; + const { toggleLoadModal, setActiveTabIndex } = load_modal; + const { ui } = useStore(); + const { is_desktop } = ui; + const { onCloseDialog, dialog_options, is_dialog_open, setActiveTab, setPreviewOnPopup } = dashboard; const { setFormVisibility } = quick_strategy; - const sendToRudderStackOnQuickStrategyIconClick = () => { - // send to rs if quick strategy is opened from dashbaord - rudderStackSendQsOpenEventFromDashboard(); - }; - - const file_input_ref = React.useRef(null); - const openGoogleDriveDialog = () => { - showVideoDialog({ - type: 'google', - }); + toggleLoadModal(); + setActiveTabIndex(is_mobile ? 1 : 2); + setActiveTab(DBOT_TABS.BOT_BUILDER); }; const openFileLoader = () => { - file_input_ref?.current?.click(); + toggleLoadModal(); + setActiveTabIndex(is_mobile ? 0 : 1); + setActiveTab(DBOT_TABS.BOT_BUILDER); }; const actions: TCardArray[] = [ @@ -69,7 +52,7 @@ const Cards = observer(({ is_mobile, has_dashboard_strategies }: TCardProps) => }, { type: 'google-drive', - icon: 'IcGoogleDrive', + icon: 'IcGoogleDriveDbot', content: localize('Google Drive'), method: openGoogleDriveDialog, }, @@ -83,12 +66,11 @@ const Cards = observer(({ is_mobile, has_dashboard_strategies }: TCardProps) => }, { type: 'quick-strategy', - icon: 'IcBlockly', + icon: 'IcQuickStrategy', content: localize('Quick strategy'), method: () => { setActiveTab(DBOT_TABS.BOT_BUILDER); setFormVisibility(true); - sendToRudderStackOnQuickStrategyIconClick(); }, }, ]; @@ -127,25 +109,14 @@ const Cards = observer(({ is_mobile, has_dashboard_strategies }: TCardProps) => method(); }} /> - + {content} ); })} - { - handleFileChange(e, false); - loadFileFromLocal(); - setFileLoaded(true); - setOpenSettings(NOTIFICATION_TYPE.BOT_IMPORT); - }} - /> - + + {is_desktop ? ( > - - + ) : ( - + )} diff --git a/src/pages/tutorials/common/no-search-result-found/no-search-result.tsx b/src/pages/tutorials/common/no-search-result-found/no-search-result.tsx index 4bb3f854..04e85ff5 100644 --- a/src/pages/tutorials/common/no-search-result-found/no-search-result.tsx +++ b/src/pages/tutorials/common/no-search-result-found/no-search-result.tsx @@ -1,21 +1,21 @@ import { observer } from 'mobx-react-lite'; +import Text from '@/components/shared_ui/text'; import { useStore } from '@/hooks/useStore'; import { Icon, Localize } from '@/utils/tmp/dummy'; -import { Text } from '@deriv-com/ui'; const NoSearchResult = observer(() => { const { dashboard } = useStore(); const { faq_search_value } = dashboard; return ( -
+
- + - + - +
diff --git a/src/pages/tutorials/common/search-input/index.tsx b/src/pages/tutorials/common/search-input/index.tsx index 66ac8d81..63f67f83 100644 --- a/src/pages/tutorials/common/search-input/index.tsx +++ b/src/pages/tutorials/common/search-input/index.tsx @@ -4,7 +4,6 @@ import { observer } from 'mobx-react-lite'; import { DEBOUNCE_INTERVAL_TIME } from '@/constants/bot-contents'; import { useStore } from '@/hooks/useStore'; import { localize } from '@/utils/tmp/dummy'; -import { Analytics } from '@deriv-com/analytics'; type TSearchInput = { faq_value: string; @@ -23,12 +22,6 @@ const SearchInput = observer(({ faq_value, setFaqSearchContent, prev_active_tuto value => { filterTuotrialTab(value); setActiveTabTutorial(3); - Analytics.trackEvent('ce_bot_form', { - action: 'search', - form_name: 'ce_bot_form', - subpage_name: 'tutorials', - search_term: value, - }); if (value === '') { setActiveTabTutorial(prev_active_tutorials); } diff --git a/src/pages/tutorials/constants.ts b/src/pages/tutorials/constants.ts index 10c53099..abbe5140 100644 --- a/src/pages/tutorials/constants.ts +++ b/src/pages/tutorials/constants.ts @@ -29,11 +29,27 @@ export const guide_content: TGuideContent[] = [ { id: 1, type: 'DBotVideo', - content: localize('Deriv Bot - your automated trading partner'), - url: 'https://www.youtube.com/embed/QdI5zCkO4Gk', - src: getImageLocation('video_dbot.webp'), + content: localize('An introduction to Deriv Bot'), + url: 'https://www.youtube.com/embed/lthEgaIY1uw', + src: getImageLocation('intro_to_deriv_bot.png'), search_id: `${VIDEOS}-0`, }, + { + id: 2, + type: 'DBotVideo', + content: localize('How to build a basic trading bot with Deriv Bot'), + url: 'https://www.youtube.com/embed/mnpi2g7YakU', + src: getImageLocation('build_a_bot.png'), + search_id: `${VIDEOS}-1`, + }, + { + id: 3, + type: 'DBotVideo', + content: localize('How to use Martingale strategy on Deriv Bot'), + url: 'https://www.youtube.com/embed/FSslvF7P00I', + src: getImageLocation('how_to_use_martingale.jpg'), + search_id: `${VIDEOS}-2`, + }, ]; export const faq_content: TFaqContent[] = [ diff --git a/src/pages/tutorials/dbot-tours/common/accordion.tsx b/src/pages/tutorials/dbot-tours/common/accordion.tsx index 1d04837a..28fa5948 100644 --- a/src/pages/tutorials/dbot-tours/common/accordion.tsx +++ b/src/pages/tutorials/dbot-tours/common/accordion.tsx @@ -1,8 +1,8 @@ import React, { useState } from 'react'; import classNames from 'classnames'; +import Text from '@/components/shared_ui/text'; import { useStore } from '@/hooks/useStore'; import { Icon, localize } from '@/utils/tmp/dummy'; -import { Text } from '@deriv-com/ui'; type TContentData = { header: string; diff --git a/src/pages/tutorials/faq-content/index.tsx b/src/pages/tutorials/faq-content/index.tsx index a60f68ad..bee62e64 100644 --- a/src/pages/tutorials/faq-content/index.tsx +++ b/src/pages/tutorials/faq-content/index.tsx @@ -1,8 +1,9 @@ import React, { KeyboardEvent } from 'react'; +import Accordion from '@/components/shared_ui/accordion'; +import Text from '@/components/shared_ui/text'; import { DBOT_TABS } from '@/constants/bot-contents'; import { useStore } from '@/hooks/useStore'; import { Localize } from '@/utils/tmp/dummy'; -import { Accordion, Text } from '@deriv-com/ui'; import { TDescription } from '../tutorials.types'; type TFAQContent = { @@ -22,8 +23,8 @@ const FAQ = ({ type, content = '', src, imageclass, is_mobile }: TDescription) = return ( { const FAQContent = ({ faq_list, handleTabChange }: TFAQContent) => { const { ui } = useStore(); - const { is_mobile } = ui; + const { is_desktop } = ui; const { dashboard } = useStore(); const { faq_title, setFaqTitle } = dashboard; @@ -102,13 +103,13 @@ const FAQContent = ({ faq_list, handleTabChange }: TFAQContent) => { className='faq__title' weight='bold' key={title} - size={is_mobile ? 'xs' : 'sm'} + size={is_desktop ? 's' : 'xs'} > {title} ), content: description?.map((item, index) => ( - + )), })); }; @@ -124,7 +125,7 @@ const FAQContent = ({ faq_list, handleTabChange }: TFAQContent) => { lineHeight='xl' className='faq__wrapper__header' weight='bold' - size={is_mobile ? 'xs' : 'sm'} + size={is_desktop ? 's' : 'xs'} > diff --git a/src/pages/tutorials/guide-content/guide-content.tsx b/src/pages/tutorials/guide-content/guide-content.tsx index acc992a0..598a6213 100644 --- a/src/pages/tutorials/guide-content/guide-content.tsx +++ b/src/pages/tutorials/guide-content/guide-content.tsx @@ -1,10 +1,11 @@ import React from 'react'; import classNames from 'classnames'; +import Dialog from '@/components/shared_ui/dialog'; +import Text from '@/components/shared_ui/text'; import { DBOT_TABS } from '@/constants/bot-contents'; import { useStore } from '@/hooks/useStore'; import { removeKeyValue } from '@/utils/settings'; import { Icon, Localize, localize } from '@/utils/tmp/dummy'; -import { Dialog, Text } from '@deriv-com/ui'; type TGuideList = { content?: string; @@ -24,7 +25,7 @@ type TGuideContent = { const GuideContent = ({ guide_tab_content, video_tab_content, is_dialog_open }: TGuideContent) => { const { ui } = useStore(); - const { is_mobile } = ui; + const { is_desktop } = ui; const { dashboard } = useStore(); const { dialog_options, @@ -40,13 +41,13 @@ const GuideContent = ({ guide_tab_content, video_tab_content, is_dialog_open }: if (type === 'OnBoard') { removeKeyValue('onboard_tour_token'); setActiveTab(DBOT_TABS.DASHBOARD); - if (is_mobile) setActiveTour('onboarding'); + if (!is_desktop) setActiveTour('onboarding'); setTourDialogVisibility(true); } else { setActiveTab(DBOT_TABS.BOT_BUILDER); - if (is_mobile) setActiveTour('bot_builder'); + if (!is_desktop) setActiveTour('bot_builder'); setTourDialogVisibility(true); - if (is_mobile) setShowMobileTourDialog(true); + if (!is_desktop) setShowMobileTourDialog(true); } }; @@ -67,8 +68,8 @@ const GuideContent = ({ guide_tab_content, video_tab_content, is_dialog_open }: align='left' weight='bold' color='prominent' - LineHeight='sm' - size={is_mobile ? 'xs' : 's'} + lineHeight='s' + size={is_desktop ? 's' : 'xs'} > @@ -94,8 +95,8 @@ const GuideContent = ({ guide_tab_content, video_tab_content, is_dialog_open }: {content} @@ -113,8 +114,8 @@ const GuideContent = ({ guide_tab_content, video_tab_content, is_dialog_open }: align='left' weight='bold' color='prominent' - LineHeight='sm' - size={is_mobile ? 'xs' : 's'} + lineHeight='s' + size={is_desktop ? 's' : 'xs'} > @@ -137,7 +138,7 @@ const GuideContent = ({ guide_tab_content, video_tab_content, is_dialog_open }: className='tutorials-wrap__placeholder__button-group--play' width='4rem' height='4rem' - icon={'IcPlayOutline'} + icon={'IcPlay'} onClick={() => showVideoDialog({ type: 'url', @@ -151,8 +152,8 @@ const GuideContent = ({ guide_tab_content, video_tab_content, is_dialog_open }: {content} diff --git a/src/pages/tutorials/quick-strategy-content/quick-strategy-guides-details.tsx b/src/pages/tutorials/quick-strategy-content/quick-strategy-guides-details.tsx index fa16432e..d68d31d8 100644 --- a/src/pages/tutorials/quick-strategy-content/quick-strategy-guides-details.tsx +++ b/src/pages/tutorials/quick-strategy-content/quick-strategy-guides-details.tsx @@ -1,9 +1,9 @@ import { KeyboardEvent } from 'react'; import { observer } from 'mobx-react-lite'; +import Text from '@/components/shared_ui/text'; import { isDbotRTL } from '@/external/bot-skeleton/utils/workspace'; import { useStore } from '@/hooks/useStore'; import { Icon, Localize } from '@/utils/tmp/dummy'; -import { Text } from '@deriv-com/ui'; import { STRATEGIES } from '../../bot-builder/quick-strategy/config'; import StrategyTabContent from '../../bot-builder/quick-strategy/form-wrappers/strategy-tab-content'; @@ -22,8 +22,15 @@ type TQuickStrategyGuides = { const QuickStrategyGuidesDetail = observer( ({ quick_strategy_tab_content, tutorial_selected_strategy, setTutorialSelectedStrategy }: TQuickStrategyGuides) => { const { ui } = useStore(); - const { is_mobile } = ui; - const text_size = is_mobile ? 'xs' : 'sm'; + const { is_desktop } = ui; + const text_size = is_desktop ? 's' : 'xs'; + + const scrollToTop = () => { + const qs_guide = document.querySelector('.tutorials-mobile__qs-guide'); + if (qs_guide) { + qs_guide.scrollTop = 0; + } + }; return ( <> @@ -33,7 +40,10 @@ const QuickStrategyGuidesDetail = observer(
setTutorialSelectedStrategy(qs_name)} + onClick={() => { + setTutorialSelectedStrategy(qs_name); + scrollToTop(); + }} tabIndex={index} data-testid={'dt_quick_strategy_guides_details'} onKeyDown={(e: KeyboardEvent) => { @@ -48,7 +58,7 @@ const QuickStrategyGuidesDetail = observer( align='center' weight='bold' color='prominent' - LineHeight='sm' + lineHeight='s' size={text_size} > {type} @@ -61,7 +71,7 @@ const QuickStrategyGuidesDetail = observer( @@ -85,7 +95,7 @@ const QuickStrategyGuidesDetail = observer( { @@ -94,11 +104,11 @@ const QuickStrategyGuidesDetail = observer( > '} /> - +
- + diff --git a/src/pages/tutorials/quick-strategy-content/quick-strategy-guides.tsx b/src/pages/tutorials/quick-strategy-content/quick-strategy-guides.tsx index 52b176c1..6b8676ec 100644 --- a/src/pages/tutorials/quick-strategy-content/quick-strategy-guides.tsx +++ b/src/pages/tutorials/quick-strategy-content/quick-strategy-guides.tsx @@ -1,13 +1,13 @@ import React from 'react'; +import Text from '@/components/shared_ui/text'; import { useStore } from '@/hooks/useStore'; import { localize } from '@/utils/tmp/dummy'; -import { Text } from '@deriv-com/ui'; import QuickStrategyGuidesDetail from './quick-strategy-guides-details'; import './index.scss'; const QuickStrategyGuides = () => { const { ui } = useStore(); - const { is_mobile } = ui; + const { is_desktop } = ui; const { dashboard } = useStore(); const { quick_strategy_tab_content } = dashboard; const [tutorial_selected_strategy, setTutorialSelectedStrategy] = React.useState(''); @@ -19,8 +19,8 @@ const QuickStrategyGuides = () => { className='tutorials-quick-strategy__title' weight='bold' color='prominent' - LineHeight='sm' - size={is_mobile ? 'xs' : 's'} + lineHeight='s' + size={is_desktop ? 's' : 'xs'} as='div' > {localize('Quick strategy guides')} diff --git a/src/pages/tutorials/tutorials-tab-desktop.tsx b/src/pages/tutorials/tutorials-tab-desktop.tsx index 1c2f989e..9fff461a 100644 --- a/src/pages/tutorials/tutorials-tab-desktop.tsx +++ b/src/pages/tutorials/tutorials-tab-desktop.tsx @@ -1,9 +1,9 @@ import React from 'react'; import classNames from 'classnames'; import { observer } from 'mobx-react-lite'; +import Tabs from '@/components/shared_ui/tabs'; import { useStore } from '@/hooks/useStore'; import { Icon } from '@/utils/tmp/dummy'; -import { Tabs } from '@deriv-com/ui'; import SearchInput from './common/search-input'; import { TTutorialsTabItem } from './tutorials'; @@ -33,7 +33,7 @@ const TutorialsTabDesktop = observer(({ tutorial_tabs, prev_active_tutorials }: }, [active_tab_tutorials]); return ( -
+
(null); React.useEffect(() => { if (search) setShowSearchBar(true); @@ -30,6 +31,12 @@ const TutorialsTabMobile = observer(({ tutorial_tabs, prev_active_tutorials }: T const onFocusSearch = () => setActiveTabTutorial(3); + const scrollToTop = () => { + if (scroll_ref.current) { + scroll_ref.current.scrollTop = 0; + } + }; + const onChangeHandle = React.useCallback( ({ target }: React.ChangeEvent) => setActiveTabTutorial(tutorial_tabs.findIndex(i => i.label === target.value)), @@ -109,9 +116,17 @@ const TutorialsTabMobile = observer(({ tutorial_tabs, prev_active_tutorials }: T value={selectedTab.label} label='' should_show_empty_option={false} - onChange={onChangeHandle} + onChange={e => { + onChangeHandle(e); + scrollToTop(); + }} + /> + -
{selectedTab.content}
diff --git a/src/pages/tutorials/tutorials.scss b/src/pages/tutorials/tutorials.scss index 9f30391d..fafcc76d 100644 --- a/src/pages/tutorials/tutorials.scss +++ b/src/pages/tutorials/tutorials.scss @@ -1,10 +1,11 @@ .tutorials-wrap { - .no-search { + %no-search { display: flex; justify-content: center; width: 100%; word-break: break-all; } + .dc-dialog { &__dialog { width: 80vw; @@ -15,6 +16,7 @@ border-radius: 0; position: relative; z-index: 1; + @include mobile { width: 94%; height: auto; @@ -26,7 +28,7 @@ &--end { position: absolute; top: 0; - inset-inline-end: 1rem; + padding: 0.8rem; z-index: 90; } } @@ -41,47 +43,59 @@ display: none; } } + &--placeholder { width: 28rem; } + &--tour { cursor: pointer; } + &__group { margin-bottom: 5.2rem; + &__guides { display: flex; margin-top: 2.4rem; + @include mobile { display: unset; } } + &__title { @include mobile { margin-bottom: 1.4rem; } } + &__nosearch { - @extend .no-search; + @extend %no-search; } + &__cards { display: flex; text-align: center; flex-direction: column; margin-inline-end: 2.4rem; + @include mobile { flex-direction: row; width: auto; + span { text-align: start; width: 100%; } } } + @include mobile { flex-direction: column; margin-bottom: 2.2rem; } + &:last-child { margin-bottom: 0; } @@ -89,32 +103,35 @@ &__placeholder { @include flex-center; + background: var(--checkbox-disabled-grey); margin-bottom: 0.8rem; - margin-inline-end: 2.4rem; height: 16rem; width: 28rem; background-size: 100% 100%; + &__description { width: 28rem; + @include mobile { text-align: start; width: calc(100% - 14.8rem); } } + @include mobile { height: 8.7rem; width: 14.8rem; - margin: 0; - margin-inline-end: 0.8rem; + margin: 0 0.8rem 0.8rem 0; } + &__tours { height: 13.5rem; background-size: contain; - margin-bottom: 0.8rem; - margin-inline-end: 0.8rem; + margin: 0 0.8rem 0.8rem 0; width: 21.5rem; cursor: pointer; + @include mobile { height: 8.7rem; width: 14.8rem; @@ -123,19 +140,21 @@ &__button-group { @include flex-center; - width: 20rem; - height: 7rem; + + padding: 1.6rem 3.2rem; border-radius: 1rem; cursor: pointer; - background-color: rgba(0, 0, 0, 0.5); + background-color: rgb(0 0 0 / 50%); + &--play { filter: invert(1); } + @include mobile { - height: 6rem; - width: 8rem; + padding: 0.8rem 1.6rem; } } + &--disabled { pointer-events: none; } @@ -148,8 +167,9 @@ padding-bottom: 18px; &__nosearch { - @extend .no-search; + @extend %no-search; } + &__content { width: 85%; @@ -157,26 +177,33 @@ width: 100%; } } + .dc-accordion { &__item { border: unset; border-bottom: 0.1rem solid var(--general-section-1); + &:last-child { margin-bottom: 2rem; } + &-header { @include flex-center(space-between); } + &-content { .loss-control { width: 80%; + @include mobile { width: 100%; } } + img { width: 45%; } + @include mobile { width: 100%; @@ -187,6 +214,7 @@ } } } + &__header { margin: 0 0 1rem 0.5rem; } @@ -195,6 +223,7 @@ .tour-dialog { transition: unset; + .dc-dialog__dialog { transform: unset; opacity: unset; @@ -204,6 +233,7 @@ width: 90vw; padding: 1.6rem; } + @include tablet { width: 90vw; padding: 1.6rem; @@ -245,12 +275,14 @@ .tutorials-wrapper { width: 100%; background: var(--general-main-1); + .dc-tabs { &__wrapper { padding: 1.6rem 0.8rem; &__group { @include flex-center; + width: 22.5rem; position: relative; padding: 1.6rem 0.8rem; @@ -262,6 +294,7 @@ inset-inline-start: 1.8rem; z-index: 1; } + .close-icon { cursor: pointer; position: absolute; @@ -290,10 +323,9 @@ @include mobile { width: 100%; - margin-inline-start: 17px; + margin-inline: 17px 0; height: 4rem; padding-inline-start: 13px; - margin-inline-end: 0; } } } @@ -304,6 +336,7 @@ height: unset; } } + &__content { margin: -6.5rem 2.4rem; width: 100%; @@ -313,14 +346,18 @@ .tutorials-wrap { margin-bottom: 3rem; } + &--no-result { @include flex-center(flex-start); + flex-direction: column; height: 100vh; margin: unset; + svg { margin-bottom: 2.4rem; } + &__title, &__content { margin-bottom: 0.8rem; @@ -332,10 +369,12 @@ &--top { display: flex; + @include mobile { height: calc(100vh - 22rem); } } + &__list { width: 22.5rem; display: flex; @@ -355,6 +394,7 @@ &:first-child { margin-top: -7.2rem; } + .tutorials-guide:nth-child(1), .tutorials-faq:nth-child(2), .tutorials-qs-guide:nth-child(3) { @@ -369,10 +409,12 @@ &__item { width: 100% !important; + &--top { &:first-child { margin-top: 7.5rem; } + &:nth-last-child(2) { display: none; } @@ -397,30 +439,36 @@ .tutorials-mobile { padding: 1.6rem; - overflow-x: hidden; - overflow-y: auto; + overflow: hidden auto; + &__select { height: 4rem; margin-bottom: 1.5rem; + @include flex-center; + @include mobile { .dc-select-native { position: relative; margin-inline-end: 17px; transition: all 0.3s; } + &--show-search { .dc-select-native { width: 0; margin: 0; visibility: hidden; } + .dc-tabs__wrapper__group__search-input { width: 100%; } + .arrow-left-bold { display: block; } + .close-icon { display: block; cursor: pointer; @@ -428,6 +476,7 @@ inset-inline-end: 2.5rem; z-index: 1; } + .dc-select-native__display, .dc-select-native__picker, .search-icon { @@ -440,10 +489,12 @@ width: 0; display: none; } + .arrow-left-bold, .close-icon { display: none; } + .search-icon { display: block; } @@ -458,6 +509,7 @@ @include mobile { height: calc(var(--vh) - 280px); overflow: auto; + .tutorials-wrap { margin-bottom: 2rem; } diff --git a/src/pages/tutorials/tutorials.tsx b/src/pages/tutorials/tutorials.tsx index 05d9037d..3ebdd1cc 100644 --- a/src/pages/tutorials/tutorials.tsx +++ b/src/pages/tutorials/tutorials.tsx @@ -20,7 +20,7 @@ export type TTutorialsTabItem = { const TutorialsTab = observer(({ handleTabChange }: TTutorialsTab) => { const { ui } = useStore(); - const { is_mobile } = ui; + const { is_desktop } = ui; const { dashboard } = useStore(); const [prev_active_tutorials, setPrevActiveTutorialsTab] = React.useState(0); @@ -82,10 +82,10 @@ const TutorialsTab = observer(({ handleTabChange }: TTutorialsTab) => { }, ]; - return is_mobile ? ( - - ) : ( + return is_desktop ? ( + ) : ( + ); }); diff --git a/src/public-path.ts b/src/public-path.ts index 49f190e5..93d30252 100644 --- a/src/public-path.ts +++ b/src/public-path.ts @@ -13,6 +13,6 @@ export function setBotPublicPath(path: string) { window.__webpack_public_path__ = path; // eslint-disable-line no-global-assign } -export const getImageLocation = (image_name: string) => getUrlBase(`/public/images/common/${image_name}`); +export const getImageLocation = (image_name: string) => `assets/images/${image_name}`; setBotPublicPath(getUrlBase('/'));