Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(Snackbar/AppRootPortal): fix default shouldDisablePortalLogic in AppRootPortal #6389

Conversation

mendrew
Copy link
Contributor

@mendrew mendrew commented Jan 16, 2024


Описание

В рефакторинге AppRootPortal в c7e4c41 мы инверсировали логику использования портала и там закралась ошибка в значении по умолчанию. До рефакторинга мы использовали портал если mode !== 'full',

const forcePortal = forcePortalProp ?? mode !== 'full';
const portalContainer = getPortalContainer(portalRootProp, portalRoot);
const ignoreDisablePortalFlagFromContext = portalRootProp && forcePortal;
const shouldUsePortal = ignoreDisablePortalFlagFromContext
? true
: !disablePortal && portalContainer && forcePortal;

а теперь выключаем портал если mode !== 'full'.

function shouldDisablePortal(
usePortal: AppRootPortalProps['usePortal'],
mode: AppRootContextInterface['mode'],
disablePortal: boolean,
) {
if (usePortal !== undefined) {
if (typeof usePortal !== 'boolean') {
return false;
}
return disablePortal || usePortal !== true;
}
// fallback
return disablePortal || mode === 'full';
}

Эта ошибка повлекла за собой по крайней мере неверное позиционирование Snackbar, когда речь идёт о Snackbar + Tabbar у Epic в режиме миниапов (mode="full"). Snackbar рендерился используя портал, тем самым выпадая из селектора, задающего отступ.

Возможно, что нам тут даже не стоит полагаться на селектор вовсе и читать информацию о наличии tabbar из контекста, определяя размер экрана в котором tabbar рендерится внизу. В то же время Epic это больше о мобильных экранах.
Тем не менее ошибка в AppRootPortal есть.

Изменения

  • Поправил условие для режима full по умолчанию. Покрыл тестами.
  • обернул children в React.Fragment чтобы ts не ругался на типы AppRootPortal.
'AppRootPortal' cannot be used as a JSX component.
Its return type 'ReactNode' is not a valid JSX element. (tsserver 2786)

After refactoring in c7e4c41
We inversed the logic and forgot to inverse the mode condition too.
If we want to disablePortal in fallback we should disable the portal
when the mode='full'

That issue affected Snackbar position when it is used together with
Epic and tabbar.
@mendrew mendrew changed the title Fix shouldDisablePortalLogic in AppRootPortal fix(Snackbar/AppRootPortal): fix default shouldDisablePortalLogic in AppRootPortal Jan 16, 2024
Copy link
Contributor

github-actions bot commented Jan 16, 2024

size-limit report 📦

Path Size
JS 347.98 KB (+0.01% 🔺)
JS (gzip) 106.44 KB (+0.01% 🔺)
JS (brotli) 87.94 KB (-0.08% 🔽)
JS import Div (tree shaking) 1.43 KB (0%)
CSS 256.43 KB (0%)
CSS (gzip) 33.6 KB (0%)
CSS (brotli) 27.29 KB (0%)

Copy link

codesandbox-ci bot commented Jan 16, 2024

This pull request is automatically built and testable in CodeSandbox.

To see build info of the built libraries, click here or the icon next to each commit SHA.

Latest deployment of this branch, based on commit f5513f6:

Sandbox Source
VKUI TypeScript Configuration

Copy link
Contributor

github-actions bot commented Jan 16, 2024

e2e tests

Playwright Report

Copy link
Contributor

github-actions bot commented Jan 16, 2024

👀 Docs deployed

Commit f5513f6

Copy link

codecov bot commented Jan 16, 2024

Codecov Report

All modified and coverable lines are covered by tests ✅

Comparison is base (c2f2079) 81.29% compared to head (f5513f6) 81.42%.
Report is 6 commits behind head on master.

Additional details and impacted files
@@            Coverage Diff             @@
##           master    #6389      +/-   ##
==========================================
+ Coverage   81.29%   81.42%   +0.13%     
==========================================
  Files         326      326              
  Lines       10127    10113      -14     
  Branches     3406     3401       -5     
==========================================
+ Hits         8233     8235       +2     
+ Misses       1894     1878      -16     
Flag Coverage Δ
unittests 81.42% <100.00%> (+0.13%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

@github-actions github-actions bot added the patch Автоматизация: PR продублируется в ветку последнего минорного релиза для выпуска патча label Jan 17, 2024
@mendrew mendrew marked this pull request as ready for review January 17, 2024 10:24
@mendrew mendrew requested a review from a team as a code owner January 17, 2024 10:24
@scffs
Copy link
Contributor

scffs commented Jan 17, 2024

Отдельное спасибо за подробное описание проблемы

Copy link
Contributor

@inomdzhon inomdzhon left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🚀

@mendrew mendrew added this to the v6.0.1 milestone Jan 24, 2024
@mendrew mendrew merged commit 2fb0272 into master Jan 29, 2024
47 checks passed
@mendrew mendrew deleted the mendrew/6380/Snackbar/AppRootPortal/fix-snackbar-position-with-epic-tabbar branch January 29, 2024 09:47
vkcom-publisher pushed a commit that referenced this pull request Jan 29, 2024
…AppRootPortal (#6389)

В рефакторинге AppRootPortal в c7e4c41 мы инверсировали логику использования портала и там закралась ошибка в значении по умолчанию. До рефакторинга мы использовали портал если `mode !== 'full'`,
https://github.com/VKCOM/VKUI/blob/7f1888d54ca8fb08a0a8d8d3697f0a19ccab6d19/packages/vkui/src/components/AppRoot/AppRootPortal.tsx#L35-L42

а теперь выключаем портал если `mode !== 'full'`.
https://github.com/VKCOM/VKUI/blob/959611e24e6168643ff409d8db08a585825d030f/packages/vkui/src/components/AppRoot/AppRootPortal.tsx#L38-L51

Эта ошибка повлекла за собой по крайней мере неверное позиционирование Snackbar, когда речь идёт о Snackbar + Tabbar у Epic в режиме миниапов (`mode="full"`). Snackbar рендерился используя портал, тем самым выпадая из селектора, задающего отступ.

Возможно, что нам тут даже не стоит полагаться на селектор вовсе и читать информацию о наличии tabbar из контекста, определяя размер экрана в котором tabbar рендерится внизу. В то же время Epic это больше о мобильных экранах.
Тем не менее ошибка в AppRootPortal есть.

Изменения
- Поправил условие для режима `full` по умолчанию. Покрыл тестами.
- обернул children в React.Fragment чтобы ts не ругался на типы AppRootPortal.
```
'AppRootPortal' cannot be used as a JSX component.
Its return type 'ReactNode' is not a valid JSX element. (tsserver 2786)
```
@vkcom-publisher
Copy link
Contributor

v6.0.1 🎉

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
patch Автоматизация: PR продублируется в ветку последнего минорного релиза для выпуска патча
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[Bug]: Snackbar перекрывает Tabbar при появлении
5 participants