mirror of
https://github.com/twentyhq/twenty
synced 2026-04-21 13:37:22 +00:00
## Problem **CRITICAL:** Two PRs were accidentally reverted when PR #14347 "Prevent csv export injections" was merged: 1. **PR #14348** "[Page Layout] - Review Refactor" - ✅ **RESTORED** 2. **PR #14352** "Fix wrong path used by backend" - ✅ **RESTORED** ## Root Cause Analysis During the merge of PR #14347, there was a complex merge conflict with PR #14352 "Fix wrong path used by backend". The merge commit `324d7204bb` in the PR #14347 branch brought in changes from PR #14352, but during the conflict resolution, **BOTH PR #14348 and PR #14352's changes were accidentally overwritten**. ## What This PR Restores This PR restores **BOTH** PRs by cherry-picking their commits: ### ✅ PR #14348 Changes Restored: - `GraphWidgetRenderer.tsx` - was deleted, now restored - `WidgetRenderer.tsx` - was missing, now restored - `SettingsPageLayoutTabsInstanceId.ts` - was deleted, now restored - `useUpdatePageLayoutWidget.ts` - was renamed back, now restored with correct name - Multiple test files that were deleted - Several hook files that were renamed/reverted - File renames: `usePageLayoutWidgetUpdate.ts` → `useUpdatePageLayoutWidget.ts` - Hook refactoring and test file organization - Page layout component improvements ### ✅ PR #14352 Changes Restored: - **Types moved to twenty-shared:** - `packages/twenty-shared/src/types/AppBasePath.ts` ✅ RESTORED - `packages/twenty-shared/src/types/AppPath.ts` ✅ RESTORED - `packages/twenty-shared/src/types/SettingsPath.ts` ✅ RESTORED - **Navigation utilities moved to twenty-shared:** - `packages/twenty-shared/src/utils/navigation/getAppPath.ts` ✅ RESTORED - `packages/twenty-shared/src/utils/navigation/getSettingsPath.ts` ✅ RESTORED - **200+ import statements updated** across the codebase to use twenty-shared - **Old type files deleted** from twenty-front/src/modules/types/ ## Evidence of Complete Restoration **Before (reverted state):** - ❌ Types were in `packages/twenty-front/src/modules/types/` - ❌ Page layout files missing - ❌ Hook files incorrectly named **After (this PR):** - ✅ Types correctly in `packages/twenty-shared/src/types/` - ✅ All page layout files restored - ✅ Hook files correctly named - ✅ All import statements updated ## Verification **Total changes:** - PR #14348: 36 files changed, 863 insertions(+), 442 deletions(-) - PR #14352: 243 files changed, 492 insertions(+), 461 deletions(-) - **Combined: 279 files changed, 1355 insertions(+), 903 deletions(-)** ## Impact This completely restores both PRs that were accidentally lost, ensuring: 1. Page layout refactoring work is back 2. Type organization and path utilities are correctly in twenty-shared 3. Backend email paths work correctly again 4. No functionality is lost Fixes the reversion caused by the merge conflict in PR #14347. --------- Co-authored-by: nitin <142569587+ehconitin@users.noreply.github.com>
106 lines
3.2 KiB
TypeScript
106 lines
3.2 KiB
TypeScript
import styled from '@emotion/styled';
|
|
import { isNonEmptyString } from '@sniptt/guards';
|
|
import { AppPath } from 'twenty-shared/types';
|
|
import { getImageAbsoluteURI, isDefined } from 'twenty-shared/utils';
|
|
import { Avatar } from 'twenty-ui/display';
|
|
import { UndecoratedLink } from 'twenty-ui/navigation';
|
|
import { REACT_APP_SERVER_BASE_URL } from '~/config';
|
|
import { useRedirectToDefaultDomain } from '~/modules/domain-manager/hooks/useRedirectToDefaultDomain';
|
|
|
|
type LogoProps = {
|
|
primaryLogo?: string | null;
|
|
secondaryLogo?: string | null;
|
|
placeholder?: string | null;
|
|
onClick?: () => void;
|
|
};
|
|
|
|
const StyledContainer = styled.div`
|
|
height: ${({ theme }) => theme.spacing(12)};
|
|
margin-bottom: ${({ theme }) => theme.spacing(4)};
|
|
margin-top: ${({ theme }) => theme.spacing(4)};
|
|
|
|
position: relative;
|
|
width: ${({ theme }) => theme.spacing(12)};
|
|
`;
|
|
|
|
const StyledSecondaryLogo = styled.img`
|
|
border-radius: ${({ theme }) => theme.border.radius.xs};
|
|
height: ${({ theme }) => theme.spacing(6)};
|
|
width: ${({ theme }) => theme.spacing(6)};
|
|
`;
|
|
|
|
const StyledSecondaryLogoContainer = styled.div`
|
|
align-items: center;
|
|
background-color: ${({ theme }) => theme.background.primary};
|
|
border-radius: ${({ theme }) => theme.border.radius.sm};
|
|
bottom: ${({ theme }) => `-${theme.spacing(3)}`};
|
|
display: flex;
|
|
height: ${({ theme }) => theme.spacing(7)};
|
|
justify-content: center;
|
|
|
|
position: absolute;
|
|
right: ${({ theme }) => `-${theme.spacing(3)}`};
|
|
width: ${({ theme }) => theme.spacing(7)};
|
|
`;
|
|
|
|
const StyledPrimaryLogo = styled.div<{ src: string }>`
|
|
background: url(${(props) => props.src});
|
|
background-size: cover;
|
|
height: 100%;
|
|
width: 100%;
|
|
`;
|
|
|
|
export const Logo = ({
|
|
primaryLogo,
|
|
secondaryLogo,
|
|
placeholder,
|
|
onClick,
|
|
}: LogoProps) => {
|
|
const { redirectToDefaultDomain } = useRedirectToDefaultDomain();
|
|
const defaultPrimaryLogoUrl = `${window.location.origin}/images/icons/android/android-launchericon-192-192.png`;
|
|
|
|
const primaryLogoUrl = getImageAbsoluteURI({
|
|
imageUrl: primaryLogo ?? defaultPrimaryLogoUrl,
|
|
baseUrl: REACT_APP_SERVER_BASE_URL,
|
|
});
|
|
|
|
const secondaryLogoUrl = isNonEmptyString(secondaryLogo)
|
|
? getImageAbsoluteURI({
|
|
imageUrl: secondaryLogo,
|
|
baseUrl: REACT_APP_SERVER_BASE_URL,
|
|
})
|
|
: null;
|
|
|
|
const isUsingDefaultLogo = !isDefined(primaryLogo);
|
|
|
|
return (
|
|
<StyledContainer onClick={() => onClick?.()}>
|
|
{isUsingDefaultLogo ? (
|
|
<UndecoratedLink
|
|
to={AppPath.SignInUp}
|
|
onClick={redirectToDefaultDomain}
|
|
>
|
|
<StyledPrimaryLogo src={primaryLogoUrl} />
|
|
</UndecoratedLink>
|
|
) : (
|
|
<StyledPrimaryLogo src={primaryLogoUrl} />
|
|
)}
|
|
{isDefined(secondaryLogoUrl) ? (
|
|
<StyledSecondaryLogoContainer>
|
|
<StyledSecondaryLogo src={secondaryLogoUrl} />
|
|
</StyledSecondaryLogoContainer>
|
|
) : (
|
|
isDefined(placeholder) && (
|
|
<StyledSecondaryLogoContainer>
|
|
<Avatar
|
|
size="lg"
|
|
placeholder={placeholder}
|
|
type="squared"
|
|
placeholderColorSeed={placeholder}
|
|
/>
|
|
</StyledSecondaryLogoContainer>
|
|
)
|
|
)}
|
|
</StyledContainer>
|
|
);
|
|
};
|