Skip to content

Commit

Permalink
Fixes after PR reviews
Browse files Browse the repository at this point in the history
  • Loading branch information
doracretu3pillar committed Oct 1, 2024
1 parent e171ae7 commit 01782b3
Show file tree
Hide file tree
Showing 11 changed files with 40 additions and 87 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,6 @@ export const getStyles = ({ v1: { spacing, colors } }: GrafanaTheme2) => ({
color: ${colors.textBlue};
}
`,
howToUpdateTitle: css``,
howToUpdateDescription: css``,
newVersionsTitle: css`
font-weight: 500;
font-size: 16px;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,12 @@ import { EnhancedStore } from '@reduxjs/toolkit';

const checkUpdatesChangeLogsSpy = jest.spyOn(GrafanaUpdates, 'checkUpdatesChangeLogs');
describe('PerconaUpdateVersion', () => {
function setup(store: EnhancedStore) {
return render(
const setup = (store: EnhancedStore) =>
render(
<Provider store={store}>
<PerconaUpdateVersion />
</Provider>
);
}

beforeEach(() => {
jest.clearAllMocks();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,38 +2,31 @@ import React, { FC, useEffect, useState } from 'react';

import { dateTimeFormat } from '@grafana/data';
import { Modal, useStyles2, Button } from '@grafana/ui';
import {
checkUpdatesChangeLogs,
getSnoozeCurrentVersion,
setSnoozeCurrentUpdate,
UpdatesChangelogs,
} from 'app/percona/shared/core/reducers/updates';
import { getUpdatesInfo } from 'app/percona/shared/core/selectors';
import { checkUpdatesChangeLogs, UpdatesChangelogs } from 'app/percona/shared/core/reducers/updates';
import { getTour, getUpdatesInfo } from 'app/percona/shared/core/selectors';
import { useAppDispatch } from 'app/store/store';
import { useSelector } from 'app/types';

import { Messages } from './PerconaUpdateVersion.constants';
import { getStyles } from './PerconaUpdateVersion.styles';
import { PMM_UPDATES_LINK } from 'app/percona/shared/components/PerconaBootstrapper/PerconaNavigation';
import { setSnoozedVersion } from 'app/percona/shared/core/reducers/user/user';

const PerconaUpdateVersion: FC = () => {
const { updateAvailable, installed, latest, changeLogs, lastChecked, snoozeCurrentVersion } =
useSelector(getUpdatesInfo);

const { updateAvailable, installed, latest, changeLogs, lastChecked } = useSelector(getUpdatesInfo);
const { snoozeCurrentVersion } = useSelector(getTour);
const [showUpdate, setShowUpdate] = useState(false);
const dispatch = useAppDispatch();
const styles = useStyles2(getStyles);

useEffect(() => {

const prepareModal = async () => {
if (!snoozeCurrentVersion) {
await dispatch(getSnoozeCurrentVersion());
await dispatch(fetchUserDetailsAction());
}

if (
(installed?.version !== latest?.version &&
snoozeCurrentVersion?.snoozedPmmVersion !== latest?.version) ||
(installed?.version !== latest?.version && snoozeCurrentVersion?.snoozedPmmVersion !== latest?.version) ||
!lastChecked
) {
setShowUpdate(true);
Expand All @@ -49,11 +42,9 @@ const PerconaUpdateVersion: FC = () => {
const snoozeUpdate = async () => {
if (latest && latest.version) {
const payload = {
productTourCompleted: snoozeCurrentVersion?.productTourCompleted || true,
alertingTourCompleted: snoozeCurrentVersion?.alertingTourCompleted || true,
snoozedPmmVersion: latest.version,
version: latest.version.toString(),
};
await dispatch(setSnoozeCurrentUpdate(payload));
await dispatch(setSnoozedVersion(payload));
}
setShowUpdate(false);
};
Expand All @@ -66,7 +57,7 @@ const PerconaUpdateVersion: FC = () => {
setShowUpdate(false);
const baseUrl = `${window.location.protocol}//${window.location.hostname}${window.location.port ? `:${window.location.port}` : ''}`;
window.location.href = baseUrl + PMM_UPDATES_LINK.url;
}
};

return (
<>
Expand All @@ -79,10 +70,12 @@ const PerconaUpdateVersion: FC = () => {
<div data-testid="one-update-modal">
<h5 className={styles.version}>{changeLogs?.updates[0]?.version || ''}</h5>
<p className={styles.releaseNotesText}>
<a href={changeLogs?.updates[0]?.releaseNotesUrl || ''}>{Messages.fullReleaseNotes}</a>
<a target="_blank" rel="noopener noreferrer" href={changeLogs?.updates[0]?.releaseNotesUrl || ''}>
{Messages.fullReleaseNotes}
</a>
</p>
<h5 className={styles.howToUpdateTitle}>{Messages.howToUpdate}</h5>
<p className={styles.howToUpdateDescription}>{Messages.howToUpdateDescription}</p>
<h5>{Messages.howToUpdate}</h5>
<p>{Messages.howToUpdateDescription}</p>
<div className={styles.updateButtons}>
<Button type="button" variant="secondary" onClick={snoozeUpdate} className={styles.snoozeButton}>
{Messages.snooze}
Expand All @@ -104,7 +97,7 @@ const PerconaUpdateVersion: FC = () => {
<ul className={styles.listOfReleaseNotes}>
{changeLogs?.updates.map((update: UpdatesChangelogs) => (
<li key={update.toString()}>
<a href={update.releaseNotesUrl}>
<a target="_blank" rel="noopener noreferrer" href={update.releaseNotesUrl}>
{update.version}, {dateTimeFormat(update.timestamp, { format: 'MMM DD, YYYY' })}
</a>
</li>
Expand Down
49 changes: 1 addition & 48 deletions public/app/percona/shared/core/reducers/updates/updates.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
import { createAsyncThunk, createSlice } from '@reduxjs/toolkit';

import { withSerializedError } from 'app/features/alerting/unified/utils/redux';
import { UpdatesService } from 'app/percona/shared/services/updates';

import { CheckUpdatesPayload, SnoozePayloadBody, SnoozePayloadResponse, UpdatesState } from './updates.types';
import { CheckUpdatesPayload, UpdatesState } from './updates.types';
import { responseToPayload } from './updates.utils';

const initialState: UpdatesState = {
Expand Down Expand Up @@ -41,32 +40,6 @@ export const updatesSlice = createSlice({
...state,
isLoading: false,
}));
builder.addCase(getSnoozeCurrentVersion.pending, (state) => ({
...state,
isLoading: true,
}));
builder.addCase(getSnoozeCurrentVersion.fulfilled, (state, { payload }) => ({
...state,
snoozeCurrentVersion: payload,
isLoading: false,
}));
builder.addCase(getSnoozeCurrentVersion.rejected, (state) => ({
...state,
isLoading: false,
}));
builder.addCase(setSnoozeCurrentUpdate.pending, (state) => ({
...state,
isLoading: true,
}));
builder.addCase(setSnoozeCurrentUpdate.fulfilled, (state, { payload }) => ({
...state,
snoozeCurrentVersion: payload,
isLoading: false,
}));
builder.addCase(setSnoozeCurrentUpdate.rejected, (state) => ({
...state,
isLoading: false,
}));
},
});

Expand All @@ -84,24 +57,4 @@ export const checkUpdatesChangeLogs = createAsyncThunk('percona/checkUpdatesChan
return await UpdatesService.getUpdatesChangelogs();
});

export const setSnoozeCurrentUpdate = createAsyncThunk(
'percona/setSnoozeCurrentUpdate',
async (body: SnoozePayloadBody): Promise<SnoozePayloadResponse> =>
withSerializedError(
(async () => {
return await UpdatesService.setSnoozeCurrentVersion(body);
})()
)
);

export const getSnoozeCurrentVersion = createAsyncThunk(
'percona/getSnoozeCurrentVersion',
async (): Promise<SnoozePayloadResponse> =>
withSerializedError(
(async () => {
return await UpdatesService.getSnoozeCurrentVersion();
})()
)
);

export default updatesSlice.reducer;
11 changes: 11 additions & 0 deletions public/app/percona/shared/core/reducers/user/user.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ export const initialUserState: PerconaUserState = {
alertingTourCompleted: true,
isAuthorized: false,
isPlatformUser: false,
snoozedPmmVersion: '',
};

const perconaUserSlice = createSlice({
Expand Down Expand Up @@ -65,6 +66,16 @@ export const setProductTourCompleted = createAsyncThunk(
}
);

export const setSnoozedVersion = createAsyncThunk(
'percona/setProductTourCompleted',
async (version: string, thunkAPI): Promise<UserDetails> => {
const res = await UserService.setSnoozedVersion(version);
const details = toUserDetailsModel(res);
thunkAPI.dispatch(setUserDetails(details));
return details;
}
);

export const setAlertingTourCompleted = createAsyncThunk(
'percona/setAlertingTourCompleted',
async (alertingTourCompleted: boolean, thunkAPI): Promise<UserDetails> => {
Expand Down
1 change: 1 addition & 0 deletions public/app/percona/shared/core/reducers/user/user.types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ export interface UserDetails {
userId: number;
productTourCompleted: boolean;
alertingTourCompleted: boolean;
snoozedPmmVersion?: string;
}

export interface PerconaUserState extends UserDetails {
Expand Down
1 change: 1 addition & 0 deletions public/app/percona/shared/core/reducers/user/user.utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,5 @@ export const toUserDetailsModel = (res: UserDetailsResponse): UserDetails => ({
userId: res.user_id,
productTourCompleted: !!res.product_tour_completed,
alertingTourCompleted: !!res.alerting_tour_completed,
snoozedPmmVersion: res.snoozed_pmm_version,
});
2 changes: 1 addition & 1 deletion public/app/percona/shared/core/selectors.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ export const getServices = (state: StoreState) => state.percona.services;
export const getNodes = (state: StoreState) => state.percona.nodes;
export const getBackupLocations = (state: StoreState) => state.percona.backupLocations;
export const getTour = (state: StoreState) => state.percona.tour;
export const getAccessRoles = (state: StoreState) => state.percona.roles;
export const getAccesstourRoles = (state: StoreState) => state.percona.roles;
export const getUsers = (state: StoreState) => state.users;
export const getUsersInfo = (state: StoreState) => state.percona.users;
export const getDefaultRole = (state: StoreState) =>
Expand Down
11 changes: 1 addition & 10 deletions public/app/percona/shared/services/updates/Updates.service.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,4 @@
import {
CheckUpdatesChangeLogsResponse,
SnoozePayloadBody,
SnoozePayloadResponse,
} from 'app/percona/shared/core/reducers/updates';
import { CheckUpdatesChangeLogsResponse } from 'app/percona/shared/core/reducers/updates';

import { api } from '../../helpers/api';

Expand All @@ -13,9 +9,4 @@ export const UpdatesService = {
api.get<CheckUpdatesResponse, CheckUpdatesParams>('/v1/server/updates', true, { params: body }),

getUpdatesChangelogs: () => api.get<CheckUpdatesChangeLogsResponse, void>('/v1/server/updates/changelogs', false),

setSnoozeCurrentVersion: (body: SnoozePayloadBody) =>
api.put<SnoozePayloadResponse, SnoozePayloadBody>('/v1/users/me', body, true),

getSnoozeCurrentVersion: () => api.get<SnoozePayloadResponse, void>('/v1/users/me', false),
};
4 changes: 4 additions & 0 deletions public/app/percona/shared/services/user/User.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,10 @@ export const UserService = {
const payload: UserDetailsPutPayload = { alerting_tour_completed: completed };
return await api.put('/v1/users/me', payload);
},
async setSnoozedVersion(version: string): Promise<UserDetailsResponse> {
const payload: UserDetailsPutPayload = { snoozed_pmm_version: version };
return await api.put('/v1/users/me', payload);
},
async getUsersList(): Promise<UserListResponse> {
return await api.get('/v1/users');
},
Expand Down
2 changes: 2 additions & 0 deletions public/app/percona/shared/services/user/User.types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,13 @@ export interface UserDetailsResponse {
user_id: number;
product_tour_completed?: boolean;
alerting_tour_completed?: boolean;
snoozed_pmm_version?: string;
}

export interface UserDetailsPutPayload {
product_tour_completed?: boolean;
alerting_tour_completed?: boolean;
snoozed_pmm_version?: string;
}

export interface UserListItemResponse {
Expand Down

0 comments on commit 01782b3

Please sign in to comment.