From 4301935011d1cbeb6b595e036a3370e06fca073a Mon Sep 17 00:00:00 2001 From: Xharles Date: Tue, 13 Jan 2026 11:09:35 +0100 Subject: [PATCH 1/4] chore: reorder mobile widgets to deprioritize specific templates in the first positions --- .../widgets/MobileWidgetsView.tsx | 60 ++++++++++++++++--- 1 file changed, 52 insertions(+), 8 deletions(-) diff --git a/packages/frontend/src/mobile-components/widgets/MobileWidgetsView.tsx b/packages/frontend/src/mobile-components/widgets/MobileWidgetsView.tsx index cf6ee20d4..9c33cd774 100644 --- a/packages/frontend/src/mobile-components/widgets/MobileWidgetsView.tsx +++ b/packages/frontend/src/mobile-components/widgets/MobileWidgetsView.tsx @@ -10,6 +10,12 @@ interface IMobileWidgetsViewProps { widgets: TUserViewWidget[]; } +// Templates to deprioritize on mobile (should not appear in first 3 positions) +const MOBILE_DEPRIORITIZED_TEMPLATES = [ + "one_col_image_template", + "two_col_image_template", +]; + const MobileWidgetsView: FC = ({ widgets }) => { const widgetRef = useRef(null); const { @@ -30,28 +36,66 @@ const MobileWidgetsView: FC = ({ widgets }) => { [squareRef] ); - // Create tab options from widgets + // Reorder widgets to ensure deprioritized templates don't appear in first 3 positions + const reorderedWidgets = useMemo(() => { + const result = [...widgets]; + + // Check first 3 positions + for (let i = 0; i < Math.min(3, result.length); i += 1) { + const widget = result[i]; + if ( + MOBILE_DEPRIORITIZED_TEMPLATES.includes( + widget.widget.template.slug + ) + ) { + // Find first non-deprioritized widget after position i + const swapIndex = result.findIndex( + (w, idx) => + idx > i && + !MOBILE_DEPRIORITIZED_TEMPLATES.includes( + w.widget.template.slug + ) + ); + + if (swapIndex !== -1) { + // Swap positions + [result[i], result[swapIndex]] = [ + result[swapIndex], + result[i], + ]; + } + } + } + + return result; + }, [widgets]); + + // Create tab options from reordered widgets const tabOptions = useMemo(() => { - return widgets.map((widget, index) => ({ + return reorderedWidgets.map((widget, index) => ({ label: widget.name, value: String(index), })); - }, [widgets]); + }, [reorderedWidgets]); // Get the currently selected widget const selectedWidget = useMemo(() => { - if (widgets.length === 0) return null; - return widgets[selectedWidgetIndex]; - }, [widgets, selectedWidgetIndex]); + if (reorderedWidgets.length === 0) return null; + return reorderedWidgets[selectedWidgetIndex]; + }, [reorderedWidgets, selectedWidgetIndex]); const handleTabChange = (value: string) => { const index = parseInt(value, 10); - if (!Number.isNaN(index) && index >= 0 && index < widgets.length) { + if ( + !Number.isNaN(index) && + index >= 0 && + index < reorderedWidgets.length + ) { setSelectedWidgetIndex(index); } }; - if (widgets.length === 0) { + if (reorderedWidgets.length === 0) { return (

From 3124975a56dcd01997e365e22990e733304e116a Mon Sep 17 00:00:00 2001 From: Xharles Date: Tue, 13 Jan 2026 11:21:33 +0100 Subject: [PATCH 2/4] chore: refactor mobile widget deprioritization logic and centralize template definitions --- packages/frontend/src/config/widgets.ts | 16 ++++++++++++---- .../widgets/MobileWidgetsView.tsx | 19 +++++-------------- 2 files changed, 17 insertions(+), 18 deletions(-) diff --git a/packages/frontend/src/config/widgets.ts b/packages/frontend/src/config/widgets.ts index 455dfc676..ef847c763 100644 --- a/packages/frontend/src/config/widgets.ts +++ b/packages/frontend/src/config/widgets.ts @@ -299,23 +299,31 @@ export const WIDGETS_CONFIG = { export const TWO_COL_WIDGETS_CONFIG = { two_col_image: { - templateSlug: "two_col_image_template", + templateSlug: `${ETemplateNameRegistry.Two_Col_Image}_template`, templateName: ETemplateNameRegistry.Two_Col_Image, widgetConfig: WIDGETS_CONFIG.TWO_COL_IMAGE, }, kasandra: { - templateSlug: "kasandra_template", + templateSlug: `${ETemplateNameRegistry.Kasandra}_template`, templateName: ETemplateNameRegistry.Kasandra, widgetConfig: WIDGETS_CONFIG.KASANDRA, }, kasandraFlakeOff: { - templateSlug: "kasandra_flakeoff_template", + templateSlug: `${ETemplateNameRegistry.KasandraFlakeOff}_template`, templateName: ETemplateNameRegistry.KasandraFlakeOff, widgetConfig: WIDGETS_CONFIG.KASANDRA_FLAKEOFF, }, marketHeatmap: { - templateSlug: "market_heatmap_template", + templateSlug: `${ETemplateNameRegistry.MarketHeatmap}_template`, templateName: ETemplateNameRegistry.MarketHeatmap, widgetConfig: WIDGETS_CONFIG.MARKET_HEATMAP, }, } as const; + +/** + * Templates to deprioritize on mobile (should not appear in first 3 positions) + */ +export const MOBILE_DEPRIORITIZED_TEMPLATES = [ + `${ETemplateNameRegistry.One_Col_Image}_template`, + `${ETemplateNameRegistry.Two_Col_Image}_template`, +] as const; diff --git a/packages/frontend/src/mobile-components/widgets/MobileWidgetsView.tsx b/packages/frontend/src/mobile-components/widgets/MobileWidgetsView.tsx index 9c33cd774..0e14aa1c5 100644 --- a/packages/frontend/src/mobile-components/widgets/MobileWidgetsView.tsx +++ b/packages/frontend/src/mobile-components/widgets/MobileWidgetsView.tsx @@ -3,6 +3,7 @@ import { TabsBar } from "@alphaday/ui-kit"; import useHeaderScroll from "src/api/hooks/useHeaderScroll"; import { TUserViewWidget } from "src/api/types"; import { Logger } from "src/api/utils/logging"; +import { MOBILE_DEPRIORITIZED_TEMPLATES } from "src/config/widgets"; import CONFIG from "src/config"; import { TEMPLATES_DICT, IModuleContainer } from "src/types"; @@ -10,12 +11,6 @@ interface IMobileWidgetsViewProps { widgets: TUserViewWidget[]; } -// Templates to deprioritize on mobile (should not appear in first 3 positions) -const MOBILE_DEPRIORITIZED_TEMPLATES = [ - "one_col_image_template", - "two_col_image_template", -]; - const MobileWidgetsView: FC = ({ widgets }) => { const widgetRef = useRef(null); const { @@ -39,22 +34,18 @@ const MobileWidgetsView: FC = ({ widgets }) => { // Reorder widgets to ensure deprioritized templates don't appear in first 3 positions const reorderedWidgets = useMemo(() => { const result = [...widgets]; + const deprioritizedTemplates = + MOBILE_DEPRIORITIZED_TEMPLATES as readonly string[]; // Check first 3 positions for (let i = 0; i < Math.min(3, result.length); i += 1) { const widget = result[i]; - if ( - MOBILE_DEPRIORITIZED_TEMPLATES.includes( - widget.widget.template.slug - ) - ) { + if (deprioritizedTemplates.includes(widget.widget.template.slug)) { // Find first non-deprioritized widget after position i const swapIndex = result.findIndex( (w, idx) => idx > i && - !MOBILE_DEPRIORITIZED_TEMPLATES.includes( - w.widget.template.slug - ) + !deprioritizedTemplates.includes(w.widget.template.slug) ); if (swapIndex !== -1) { From 4b5683408b1c130cd3f9fbc1becdd7a521e78428 Mon Sep 17 00:00:00 2001 From: Xharles Date: Tue, 13 Jan 2026 11:33:10 +0100 Subject: [PATCH 3/4] chore: normalize template slugs to lowercase in widget configuration --- packages/frontend/src/config/widgets.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/frontend/src/config/widgets.ts b/packages/frontend/src/config/widgets.ts index ef847c763..0e490b107 100644 --- a/packages/frontend/src/config/widgets.ts +++ b/packages/frontend/src/config/widgets.ts @@ -299,7 +299,7 @@ export const WIDGETS_CONFIG = { export const TWO_COL_WIDGETS_CONFIG = { two_col_image: { - templateSlug: `${ETemplateNameRegistry.Two_Col_Image}_template`, + templateSlug: `${ETemplateNameRegistry.Two_Col_Image.toLowerCase()}_template`, templateName: ETemplateNameRegistry.Two_Col_Image, widgetConfig: WIDGETS_CONFIG.TWO_COL_IMAGE, }, @@ -309,12 +309,12 @@ export const TWO_COL_WIDGETS_CONFIG = { widgetConfig: WIDGETS_CONFIG.KASANDRA, }, kasandraFlakeOff: { - templateSlug: `${ETemplateNameRegistry.KasandraFlakeOff}_template`, + templateSlug: `${ETemplateNameRegistry.KasandraFlakeOff.toLowerCase()}_template`, templateName: ETemplateNameRegistry.KasandraFlakeOff, widgetConfig: WIDGETS_CONFIG.KASANDRA_FLAKEOFF, }, marketHeatmap: { - templateSlug: `${ETemplateNameRegistry.MarketHeatmap}_template`, + templateSlug: `${ETemplateNameRegistry.MarketHeatmap.toLowerCase()}_template`, templateName: ETemplateNameRegistry.MarketHeatmap, widgetConfig: WIDGETS_CONFIG.MARKET_HEATMAP, }, @@ -324,6 +324,6 @@ export const TWO_COL_WIDGETS_CONFIG = { * Templates to deprioritize on mobile (should not appear in first 3 positions) */ export const MOBILE_DEPRIORITIZED_TEMPLATES = [ - `${ETemplateNameRegistry.One_Col_Image}_template`, - `${ETemplateNameRegistry.Two_Col_Image}_template`, + `${ETemplateNameRegistry.One_Col_Image.toLowerCase()}_template`, + `${ETemplateNameRegistry.Two_Col_Image.toLowerCase()}_template`, ] as const; From 3f8cbe073de894ac338318136f544a42e57971da Mon Sep 17 00:00:00 2001 From: Xharles Date: Tue, 13 Jan 2026 15:19:21 +0100 Subject: [PATCH 4/4] chore: cast templateSlug to TTemplateSlug in DesktopWidgetsView --- packages/frontend/src/components/widgets/DesktopWidgetsView.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/frontend/src/components/widgets/DesktopWidgetsView.tsx b/packages/frontend/src/components/widgets/DesktopWidgetsView.tsx index 99b713c42..d84d60bae 100644 --- a/packages/frontend/src/components/widgets/DesktopWidgetsView.tsx +++ b/packages/frontend/src/components/widgets/DesktopWidgetsView.tsx @@ -43,7 +43,7 @@ const DesktopWidgetsView: FC = ({ if (!moduleData) return null; const Container = TEMPLATES_DICT[ - config.templateSlug + config.templateSlug as TTemplateSlug ] as FC; if (!Container) return null;