From d329139abe8f38c3124c86e4f6eaec0d30e375d1 Mon Sep 17 00:00:00 2001 From: Jordan Clarke Date: Sun, 8 Jun 2025 01:14:43 +0100 Subject: [PATCH 01/13] Fix for #916 - Added System priority and Alphabetic Ordering - First Commit Ever :) --- .../MultiselectMenu/Dropdown/Dropdown.less | 79 +++++++++++-------- .../MultiselectMenu/Dropdown/Dropdown.tsx | 41 +++++++++- 2 files changed, 84 insertions(+), 36 deletions(-) diff --git a/src/components/MultiselectMenu/Dropdown/Dropdown.less b/src/components/MultiselectMenu/Dropdown/Dropdown.less index 3bea17d22..71ca36e96 100644 --- a/src/components/MultiselectMenu/Dropdown/Dropdown.less +++ b/src/components/MultiselectMenu/Dropdown/Dropdown.less @@ -1,44 +1,55 @@ -// Copyright (C) 2017-2024 Smart code 203358507 + // Copyright (C) 2017-2024 Smart code 203358507 -@import (reference) '~stremio/common/screen-sizes.less'; + @import (reference) '~stremio/common/screen-sizes.less'; -@parent-height: 10rem; + @parent-height: 10rem; -.dropdown { - background: var(--modal-background-color); - display: none; - position: absolute; - width: 100%; - top: 100%; - left: 0; - z-index: 10; - box-shadow: var(--outer-glow); - border-radius: var(--border-radius); - overflow: hidden; - &.open { - display: block; - max-height: calc(3.3rem * 7); - overflow: auto; - } - .back-button { - display: flex; - align-items: center; - gap: 0 0.5rem; - padding: 0.75rem; - color: var(--primary-foreground-color); - .back-button-icon { - width: 1.5rem; - } - } -} - -@media (orientation: landscape) and (max-width: @xsmall) { .dropdown { + background: var(--modal-background-color); + display: none; + position: absolute; + width: 100%; + top: 100%; + left: 0; + z-index: 10; + box-shadow: var(--outer-glow); + border-radius: var(--border-radius); + overflow: hidden; + &.open { - max-height: calc(100dvh - var(--horizontal-nav-bar-size) - @parent-height); + display: block; + max-height: calc(3.3rem * 7); + overflow: auto; + } + + .back-button { + display: flex; + align-items: center; + gap: 0 0.5rem; + padding: 0.75rem; + color: var(--primary-foreground-color); + + .back-button-icon { + width: 1.5rem; + } + } + + .separator-after { + border-bottom: thin solid var(--overlay-color); } } -} \ No newline at end of file + + + + @media (orientation: landscape) and (max-width: @xsmall) { + .dropdown { + &.open { + max-height: calc(100dvh - var(--horizontal-nav-bar-size) - @parent-height); + } + } + } + + diff --git a/src/components/MultiselectMenu/Dropdown/Dropdown.tsx b/src/components/MultiselectMenu/Dropdown/Dropdown.tsx index 411ef6ab5..3aebce926 100644 --- a/src/components/MultiselectMenu/Dropdown/Dropdown.tsx +++ b/src/components/MultiselectMenu/Dropdown/Dropdown.tsx @@ -61,9 +61,45 @@ const Dropdown = ({ level, setLevel, options, onSelect, value, menuOpen }: Props : null } - {options - .filter((option: MultiselectMenuOption) => !option.hidden) + + {options + .filter((option: MultiselectMenuOption) => !option.hidden) + .sort((a, b) => { + + const userLocale = navigator.language || 'en'; + const userLangCode = userLocale.split('-')[0]; + + const getPriority = (option: MultiselectMenuOption) => { + + const value = String(option.value); + + // Check if the value matches user's language, if yes put at top of list + const matchesUser = value === userLocale || value.startsWith(userLangCode + '-'); + if (matchesUser) return 1; + + + // Check if it's English, put at the second position + const isEnglish = value.startsWith('en-') || value === 'en'; + if (isEnglish) return 2; + + return 3; // Everything else + }; + + const aPriority = getPriority(a); + const bPriority = getPriority(b); + + //Lowest number is ranked highest + if (aPriority !== bPriority) { + return aPriority - bPriority; + } + + // Same priority = alphabetical by label eg "english", "french" + return a.label.localeCompare(b.label); + }) .map((option: MultiselectMenuOption) => ( +
)) } From bd5a8e988f5c514bf2689c438ee3facabbeaa853 Mon Sep 17 00:00:00 2001 From: Jordan Clarke Date: Sun, 8 Jun 2025 13:06:14 +0100 Subject: [PATCH 02/13] Improved Fix for Stremio#916 - Added System priority and Alphabetic Ordering on other dropdowns. --- .../MultiselectMenu/Dropdown/Dropdown.tsx | 75 ++++++++++++++++--- 1 file changed, 64 insertions(+), 11 deletions(-) diff --git a/src/components/MultiselectMenu/Dropdown/Dropdown.tsx b/src/components/MultiselectMenu/Dropdown/Dropdown.tsx index 3aebce926..216261f79 100644 --- a/src/components/MultiselectMenu/Dropdown/Dropdown.tsx +++ b/src/components/MultiselectMenu/Dropdown/Dropdown.tsx @@ -17,6 +17,52 @@ type Props = { onSelect: (value: string | number) => void; }; + + + +const REVERSE_LANG_CODE_MAP: {[key:string]:string} = { + 'ar': 'ara', + 'bg': 'bul', + 'bn': 'ben', + 'ca': 'cat', + 'cs': 'ces', + 'da': 'dan', + 'de': 'deu', + 'el': 'ell', + 'en': 'eng', + 'eo': 'epo', + 'es': 'spa', + 'eu': 'eus', + 'fa': 'fas', + 'fr': 'fre', + 'he': 'heb', + 'hi': 'hin', + 'hr': 'hrv', + 'hu': 'hun', + 'id': 'ind', + 'it': 'ita', + 'ja': 'jpn', + 'ko': 'kor', + 'mk': 'mkd', + 'my': 'mya', + 'nb': 'nob', + 'nl': 'nld', + 'nn': 'nno', + 'pl': 'pol', + 'pt': 'por', + 'ru': 'rus', + 'sv': 'swe', + 'sl': 'slv', + 'sr': 'srp', + 'te': 'tel', + 'tr': 'tur', + 'uk': 'ukr', + 'vi': 'vie', + 'zh': 'zho' +}; + +// Usage: O(1) lookup + const Dropdown = ({ level, setLevel, options, onSelect, value, menuOpen }: Props) => { const { t } = useTranslation(); const optionsRef = useRef(new Map()); @@ -66,21 +112,28 @@ const Dropdown = ({ level, setLevel, options, onSelect, value, menuOpen }: Props .filter((option: MultiselectMenuOption) => !option.hidden) .sort((a, b) => { - const userLocale = navigator.language || 'en'; - const userLangCode = userLocale.split('-')[0]; + const userLocale2 = navigator.language || 'en-US'; + const userLocale:string = REVERSE_LANG_CODE_MAP[userLocale2.split('-')[0]] || 'eng'; // this is 3 leter code + // console.log(`USERBEFORE : ${userLocale2}, USERAFTER : ${userLocale}`) + + // const userLangCode = userLocale.split('-')[0]; + + // console.log(`VALUE : ${a.value}, LABEL : ${a.label}`); + + const getPriority = (option: MultiselectMenuOption) => { - - const value = String(option.value); - + + const value2 = String(option.value); + const value = value2.length == 3 ? value2 : (REVERSE_LANG_CODE_MAP[value2.split('-')[0]] || 'eng'); + + // console.log(`OPTION VALUE: ${value}`) // Check if the value matches user's language, if yes put at top of list - const matchesUser = value === userLocale || value.startsWith(userLangCode + '-'); - if (matchesUser) return 1; + if (value === userLocale) return 1; // Check if it's English, put at the second position - const isEnglish = value.startsWith('en-') || value === 'en'; - if (isEnglish) return 2; + if (value == 'eng') return 2; return 3; // Everything else }; @@ -98,8 +151,8 @@ const Dropdown = ({ level, setLevel, options, onSelect, value, menuOpen }: Props }) .map((option: MultiselectMenuOption) => (
+ key={`${String(option.label)}-${String(option.value)}`} + className={String(option.label) === 'English' ? styles['separator-after'] : ''}>