diff --git a/studio/components/interfaces/Settings/Logs/Logs.utils.ts b/studio/components/interfaces/Settings/Logs/Logs.utils.ts index 3f3d4a12aeb..22c495dd261 100644 --- a/studio/components/interfaces/Settings/Logs/Logs.utils.ts +++ b/studio/components/interfaces/Settings/Logs/Logs.utils.ts @@ -173,11 +173,11 @@ export const genSingleLogQuery = (table: LogsTableName, id: string) => */ export const maybeShowUpgradePrompt = ( from: string | null | undefined, - tier: StripeSubscription['tier'] + tierKey?: StripeSubscription['tier']["key"] ) => { const day = Math.abs(dayjs().diff(dayjs(from), 'day')) - return day > 1 && tier?.key === 'FREE' + return (day > 1 && tierKey === 'FREE') || (day > 7 && tierKey === 'PRO') || day > 90 && tierKey === 'ENTERPRISE' } export const genCountQuery = (table: string): string => `SELECT count(*) as count FROM ${table}` @@ -222,11 +222,10 @@ SELECT FROM ${table} t cross join unnest(t.metadata) as metadata - ${ - where + ${where ? where + ` and t.timestamp > '${startOffset.toISOString()}'` : `where t.timestamp > '${startOffset.toISOString()}'` - } + } GROUP BY timestamp ORDER BY diff --git a/studio/components/interfaces/Settings/Logs/LogsPreviewer.tsx b/studio/components/interfaces/Settings/Logs/LogsPreviewer.tsx index 1a9a0a19745..9b12ccac9e7 100644 --- a/studio/components/interfaces/Settings/Logs/LogsPreviewer.tsx +++ b/studio/components/interfaces/Settings/Logs/LogsPreviewer.tsx @@ -80,7 +80,7 @@ export const LogsPreviewer: React.FC = ({ // Show the prompt on page load based on query params useEffect(() => { if (its) { - const shouldShowUpgradePrompt = maybeShowUpgradePrompt(its as string, tier as StripeProduct) + const shouldShowUpgradePrompt = maybeShowUpgradePrompt(its as string, tier?.key) if (shouldShowUpgradePrompt) { setShowUpgradePrompt(!showUpgradePrompt) } @@ -129,7 +129,7 @@ export const LogsPreviewer: React.FC = ({ }, }) } else if (event === 'datepicker-change') { - const shouldShowUpgradePrompt = maybeShowUpgradePrompt(from, tier as StripeProduct) + const shouldShowUpgradePrompt = maybeShowUpgradePrompt(from, tier?.key) if (shouldShowUpgradePrompt) { setShowUpgradePrompt(!showUpgradePrompt) diff --git a/studio/components/interfaces/Settings/Logs/UpgradePrompt.tsx b/studio/components/interfaces/Settings/Logs/UpgradePrompt.tsx index 1b9cb9e82c6..0d3ca8a64ca 100644 --- a/studio/components/interfaces/Settings/Logs/UpgradePrompt.tsx +++ b/studio/components/interfaces/Settings/Logs/UpgradePrompt.tsx @@ -27,8 +27,7 @@ const UpgradePrompt: React.FC = ({ show, setShowUpgradePrompt }) => {

Logs can be retained up to a duration of 3 months depending on the plan that your - project is on. The table below shows an overview of the duration for which your logs - will be retained for based on each plan. + project is on.

diff --git a/studio/hooks/misc/useUpgradePrompt.tsx b/studio/hooks/misc/useUpgradePrompt.tsx index d709ff33d28..71aa956ca23 100644 --- a/studio/hooks/misc/useUpgradePrompt.tsx +++ b/studio/hooks/misc/useUpgradePrompt.tsx @@ -11,7 +11,7 @@ export const useUpgradePrompt = (from: string) => { const tier = subscription?.tier const [showUpgradePrompt, setShowUpgradePrompt] = useState(false) - const shouldShowUpgradePrompt = maybeShowUpgradePrompt(from, tier as StripeProduct) + const shouldShowUpgradePrompt = maybeShowUpgradePrompt(from, tier?.key) useEffect(() => { if (shouldShowUpgradePrompt) { diff --git a/studio/pages/project/[ref]/logs-explorer/index.tsx b/studio/pages/project/[ref]/logs-explorer/index.tsx index b0433ba8c95..c4bd0350289 100644 --- a/studio/pages/project/[ref]/logs-explorer/index.tsx +++ b/studio/pages/project/[ref]/logs-explorer/index.tsx @@ -77,7 +77,7 @@ export const LogsExplorerPage: NextPageWithLayout = () => { // Show the prompt on page load based on query params useEffect(() => { if (its) { - const shouldShowUpgradePrompt = maybeShowUpgradePrompt(its as string, tier as StripeProduct) + const shouldShowUpgradePrompt = maybeShowUpgradePrompt(its as string, tier?.key) if (shouldShowUpgradePrompt) { setShowUpgradePrompt(!showUpgradePrompt) } @@ -129,7 +129,7 @@ export const LogsExplorerPage: NextPageWithLayout = () => { } const handleDateChange = ({ to, from }: DatePickerToFrom) => { - const shouldShowUpgradePrompt = maybeShowUpgradePrompt(from, tier as StripeProduct) + const shouldShowUpgradePrompt = maybeShowUpgradePrompt(from, tier?.key) if (shouldShowUpgradePrompt) { setShowUpgradePrompt(!showUpgradePrompt) diff --git a/studio/tests/pages/projects/logs-query.test.js b/studio/tests/pages/projects/logs-query.test.js index 2f0080dd9c8..562616fa426 100644 --- a/studio/tests/pages/projects/logs-query.test.js +++ b/studio/tests/pages/projects/logs-query.test.js @@ -152,42 +152,41 @@ test('query warnings', async () => { await screen.findByText('1 warning') }) -describe.each(['tier_free', 'tier_pro', 'tier_enterprise'])( - 'upgrade modal for %s', - (supabase_prod_id) => { - beforeEach(() => { - useProjectSubscription.mockReturnValue({ - subscription: { - tier: { - supabase_prod_id, - }, +describe.each(['FREE', 'PRO', 'ENTERPRISE'])('upgrade modal for %s', (key) => { + beforeEach(() => { + useProjectSubscription.mockReturnValue({ + subscription: { + tier: { + supabase_prod_id: `tier_${key.toLocaleLowerCase()}`, + key, }, - }) + }, }) - test.only('based on query params', async () => { - const router = defaultRouterMock() - router.query = { - ...router.query, - q: 'some_query', - its: dayjs().subtract(4, 'months').toISOString(), - ite: dayjs().toISOString(), - } - useRouter.mockReturnValue(router) - render() + }) + test('based on query params', async () => { + const router = defaultRouterMock() + router.query = { + ...router.query, + q: 'some_query', + its: dayjs().subtract(5, 'month').toISOString(), + ite: dayjs().toISOString(), + } + useRouter.mockReturnValue(router) + render() + await screen.findByText(/Log retention/) // assert modal title is present + }) + test('based on datepicker helpers', async () => { + render() + // click on the dropdown + clickDropdown(await screen.findByText('Last 24 hours')) + userEvent.click(await screen.findByText('Last 3 days')) + + // only free tier will show modal + if (key === 'FREE') { await screen.findByText('Log retention') // assert modal title is present - }) - - test.only('based on datepicker helpers', async () => { - render() - // click on the dropdown - clickDropdown(await screen.findByText('Last 24 hours')) - userEvent.click(await screen.findByText('Last 3 days')) - - // only free tier will show modal - if (supabase_prod_id === 'tier_free') { - await screen.findByText('Log retention') // assert modal title is present - } - }) - } -) + } else { + await expect(screen.findByText('Log retention')).rejects.toThrow() + } + }) +})