diff --git a/packages/twenty-front/src/modules/app/components/SettingsRoutes.tsx b/packages/twenty-front/src/modules/app/components/SettingsRoutes.tsx index 5725423a87..28f2557a70 100644 --- a/packages/twenty-front/src/modules/app/components/SettingsRoutes.tsx +++ b/packages/twenty-front/src/modules/app/components/SettingsRoutes.tsx @@ -340,9 +340,9 @@ const SettingsAdminConfigVariableDetails = lazy(() => })), ); -const SettingsReleases = lazy(() => - import('~/pages/settings/releases/SettingsReleases').then((module) => ({ - default: module.SettingsReleases, +const SettingsUpdates = lazy(() => + import('~/pages/settings/updates/SettingsUpdates').then((module) => ({ + default: module.SettingsUpdates, })), ); @@ -625,7 +625,7 @@ export const SettingsRoutes = ({ isAdminPageEnabled }: SettingsRoutesProps) => ( /> } > - } /> + } /> diff --git a/packages/twenty-front/src/modules/settings/hooks/useSettingsNavigationItems.tsx b/packages/twenty-front/src/modules/settings/hooks/useSettingsNavigationItems.tsx index cb036f4614..f31b084dfd 100644 --- a/packages/twenty-front/src/modules/settings/hooks/useSettingsNavigationItems.tsx +++ b/packages/twenty-front/src/modules/settings/hooks/useSettingsNavigationItems.tsx @@ -202,8 +202,8 @@ const useSettingsNavigationItems = (): SettingsNavigationSection[] => { isHidden: !isAdminEnabled, }, { - label: t`Releases`, - path: SettingsPath.Releases, + label: t`Updates`, + path: SettingsPath.Updates, Icon: IconRocket, isHidden: !permissionMap[PermissionFlagType.WORKSPACE], }, diff --git a/packages/twenty-front/src/pages/settings/releases/SettingsReleases.tsx b/packages/twenty-front/src/pages/settings/releases/SettingsReleases.tsx deleted file mode 100644 index 56beaf9b6a..0000000000 --- a/packages/twenty-front/src/pages/settings/releases/SettingsReleases.tsx +++ /dev/null @@ -1,47 +0,0 @@ -import { SettingsPageContainer } from '@/settings/components/SettingsPageContainer'; -import { SubMenuTopBarContainer } from '@/ui/layout/page/components/SubMenuTopBarContainer'; -import { TabList } from '@/ui/layout/tab-list/components/TabList'; -import { t } from '@lingui/core/macro'; -import { SettingsPath } from 'twenty-shared/types'; -import { getSettingsPath } from 'twenty-shared/utils'; -import { IconFlask, IconRocket } from 'twenty-ui/display'; - -import { SettingsReleasesTabContent } from './components'; -import { SETTINGS_RELEASES_TABS, SETTINGS_RELEASES_TABS_ID } from './constants'; - -export const SettingsReleases = () => { - const tabs = [ - { - id: SETTINGS_RELEASES_TABS.CHANGELOG, - title: t`Changelog`, - Icon: IconRocket, - }, - { - id: SETTINGS_RELEASES_TABS.LAB, - title: t`Lab`, - Icon: IconFlask, - }, - ]; - - return ( - - - - - - - ); -}; diff --git a/packages/twenty-front/src/pages/settings/releases/components/SettingsReleasesChangelogContent.tsx b/packages/twenty-front/src/pages/settings/releases/components/SettingsReleasesChangelogContent.tsx deleted file mode 100644 index 81dfa6c605..0000000000 --- a/packages/twenty-front/src/pages/settings/releases/components/SettingsReleasesChangelogContent.tsx +++ /dev/null @@ -1,117 +0,0 @@ -import styled from '@emotion/styled'; -import React, { useEffect, useState } from 'react'; -import rehypeStringify from 'rehype-stringify'; -import remarkParse from 'remark-parse'; -import remarkRehype from 'remark-rehype'; -import { type PluggableList, unified } from 'unified'; -import { visit } from 'unist-util-visit'; - -import { ScrollWrapper } from '@/ui/utilities/scroll/components/ScrollWrapper'; -import { formatToHumanReadableDate } from '~/utils/date-utils'; - -type ReleaseNote = { - slug: string; - date: string; - release: string; - content: string; - html: string; -}; - -const StyledReleaseContainer = styled.div` - img { - margin: ${({ theme }) => theme.spacing(6)} 0px 0px; - max-width: 100%; - } - - p img { - margin: 0px; - } - - h3 { - color: ${({ theme }) => theme.font.color.primary}; - margin: ${({ theme }) => theme.spacing(6)} 0px 0px; - } - code { - background: ${({ theme }) => theme.background.tertiary}; - padding: 4px; - border-radius: 4px; - } - p { - color: ${({ theme }) => theme.font.color.secondary}; - font-family: Inter, sans-serif; - font-size: ${({ theme }) => theme.font.size.md}; - line-height: 19.5px; - font-weight: ${({ theme }) => theme.font.weight.regular}; - margin: ${({ theme }) => theme.spacing(6)} 0px 0px; - text-align: justify; - } - - li { - color: ${({ theme }) => theme.font.color.secondary}; - } - - li strong { - color: ${({ theme }) => theme.font.color.primary}; - } -`; - -const StyledReleaseHeader = styled.h2` - color: ${({ theme }) => theme.font.color.primary}; - font-weight: ${({ theme }) => theme.font.weight.medium}; - line-height: 18px; - font-size: ${({ theme }) => theme.font.size.md}; - margin: 0; - margin-top: ${({ theme }) => theme.spacing(10)}; - - &:first-of-type { - margin-top: 0; - } -`; - -const StyledReleaseDate = styled.span` - font-weight: ${({ theme }) => theme.font.weight.regular}; - font-size: 12px; - line-height: 18px; - color: ${({ theme }) => theme.font.color.tertiary}; -`; - -export const SettingsReleasesChangelogContent = () => { - const [releases, setReleases] = useState([]); - - useEffect(() => { - fetch('https://twenty.com/api/releases').then(async (res) => { - const json = await res.json(); - for (const release of json) { - release.html = String( - await unified() - .use([remarkParse, remarkRehype, rehypeStringify] as PluggableList) - .use(() => (tree: any) => { - visit(tree, (node) => { - if (node.tagName === 'h1' || node.tagName === 'h2') { - node.tagName = 'h3'; - } - }); - }) - .process(release.content), - ); - } - setReleases(json); - }); - }, []); - - return ( - - - {releases.map((release) => ( - - {release.release} - - {formatToHumanReadableDate(release.date)} - -
-
- ))} -
-
- ); -}; diff --git a/packages/twenty-front/src/pages/settings/releases/components/SettingsReleasesTabContent.tsx b/packages/twenty-front/src/pages/settings/releases/components/SettingsReleasesTabContent.tsx deleted file mode 100644 index 7ce6e1fc8c..0000000000 --- a/packages/twenty-front/src/pages/settings/releases/components/SettingsReleasesTabContent.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import { SettingsLabContent } from '@/settings/lab/components/SettingsLabContent'; -import { activeTabIdComponentState } from '@/ui/layout/tab-list/states/activeTabIdComponentState'; -import { useRecoilComponentValue } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValue'; -import { - SETTINGS_RELEASES_TABS, - SETTINGS_RELEASES_TABS_ID, -} from '../constants'; -import { SettingsReleasesChangelogContent } from './SettingsReleasesChangelogContent'; - -export const SettingsReleasesTabContent = () => { - const activeTabId = useRecoilComponentValue( - activeTabIdComponentState, - SETTINGS_RELEASES_TABS_ID, - ); - - switch (activeTabId) { - case SETTINGS_RELEASES_TABS.CHANGELOG: - return ; - case SETTINGS_RELEASES_TABS.LAB: - return ; - default: - return ; - } -}; diff --git a/packages/twenty-front/src/pages/settings/releases/components/index.ts b/packages/twenty-front/src/pages/settings/releases/components/index.ts deleted file mode 100644 index c5644b31ec..0000000000 --- a/packages/twenty-front/src/pages/settings/releases/components/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { SettingsReleasesChangelogContent } from './SettingsReleasesChangelogContent'; -export { SettingsReleasesTabContent } from './SettingsReleasesTabContent'; diff --git a/packages/twenty-front/src/pages/settings/releases/constants/SettingsReleasesTabs.ts b/packages/twenty-front/src/pages/settings/releases/constants/SettingsReleasesTabs.ts deleted file mode 100644 index 10a877fa62..0000000000 --- a/packages/twenty-front/src/pages/settings/releases/constants/SettingsReleasesTabs.ts +++ /dev/null @@ -1,4 +0,0 @@ -export const SETTINGS_RELEASES_TABS = { - CHANGELOG: 'changelog', - LAB: 'lab', -}; diff --git a/packages/twenty-front/src/pages/settings/releases/constants/SettingsReleasesTabsId.ts b/packages/twenty-front/src/pages/settings/releases/constants/SettingsReleasesTabsId.ts deleted file mode 100644 index 2cd50b2c81..0000000000 --- a/packages/twenty-front/src/pages/settings/releases/constants/SettingsReleasesTabsId.ts +++ /dev/null @@ -1 +0,0 @@ -export const SETTINGS_RELEASES_TABS_ID = 'settings-releases-tabs'; diff --git a/packages/twenty-front/src/pages/settings/releases/constants/index.ts b/packages/twenty-front/src/pages/settings/releases/constants/index.ts deleted file mode 100644 index e03e3fecec..0000000000 --- a/packages/twenty-front/src/pages/settings/releases/constants/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { SETTINGS_RELEASES_TABS } from './SettingsReleasesTabs'; -export { SETTINGS_RELEASES_TABS_ID } from './SettingsReleasesTabsId'; diff --git a/packages/twenty-front/src/pages/settings/releases/index.ts b/packages/twenty-front/src/pages/settings/releases/index.ts deleted file mode 100644 index 75f0132c83..0000000000 --- a/packages/twenty-front/src/pages/settings/releases/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { SettingsReleases } from './SettingsReleases'; diff --git a/packages/twenty-front/src/pages/settings/updates/SettingsUpdates.tsx b/packages/twenty-front/src/pages/settings/updates/SettingsUpdates.tsx new file mode 100644 index 0000000000..9453024d50 --- /dev/null +++ b/packages/twenty-front/src/pages/settings/updates/SettingsUpdates.tsx @@ -0,0 +1,64 @@ +import { SettingsCard } from '@/settings/components/SettingsCard'; +import { SettingsPageContainer } from '@/settings/components/SettingsPageContainer'; +import { SettingsLabContent } from '@/settings/lab/components/SettingsLabContent'; +import { SubMenuTopBarContainer } from '@/ui/layout/page/components/SubMenuTopBarContainer'; +import { useTheme } from '@emotion/react'; +import styled from '@emotion/styled'; +import { t } from '@lingui/core/macro'; +import { SettingsPath } from 'twenty-shared/types'; +import { getSettingsPath } from 'twenty-shared/utils'; +import { H2Title, IconTransform } from 'twenty-ui/display'; +import { Section } from 'twenty-ui/layout'; + +const StyledCardLink = styled.a` + text-decoration: none; +`; + +export const SettingsUpdates = () => { + const theme = useTheme(); + + return ( + + +
+ + + + } + title={t`Read changelog`} + /> + +
+ +
+ + +
+
+
+ ); +}; diff --git a/packages/twenty-shared/src/types/SettingsPath.ts b/packages/twenty-shared/src/types/SettingsPath.ts index fbdc70aba7..68bb8aec34 100644 --- a/packages/twenty-shared/src/types/SettingsPath.ts +++ b/packages/twenty-shared/src/types/SettingsPath.ts @@ -26,7 +26,7 @@ export enum SettingsPath { NewApprovedAccessDomain = 'domains/approved-access-domain/new', NewEmailingDomain = 'domains/emailing-domain/new', EmailingDomainDetail = 'domains/emailing-domain/:domainId', - Releases = 'releases', + Updates = 'updates', AI = 'ai', AINewAgent = 'ai/new-agent', AIAgentDetail = 'ai/agents/:agentId', diff --git a/packages/twenty-ui/src/display/icon/components/TablerIcons.ts b/packages/twenty-ui/src/display/icon/components/TablerIcons.ts index e757458171..520633a8cd 100644 --- a/packages/twenty-ui/src/display/icon/components/TablerIcons.ts +++ b/packages/twenty-ui/src/display/icon/components/TablerIcons.ts @@ -357,6 +357,7 @@ export { IconTimeDuration60, IconTimelineEvent, IconTool, + IconTransform, IconTrash, IconTrashOff, IconTrashX, diff --git a/packages/twenty-ui/src/display/index.ts b/packages/twenty-ui/src/display/index.ts index 5fa83cd63c..713bdd57a0 100644 --- a/packages/twenty-ui/src/display/index.ts +++ b/packages/twenty-ui/src/display/index.ts @@ -422,6 +422,7 @@ export { IconTimeDuration60, IconTimelineEvent, IconTool, + IconTransform, IconTrash, IconTrashOff, IconTrashX,