Skip to content

Commit 1969d03

Browse files
refactor(news section): remove axios library use (#1505)
#1248
1 parent 9df737d commit 1969d03

File tree

7 files changed

+54
-97
lines changed

7 files changed

+54
-97
lines changed

src/components/overlays/NewsDetail/index.tsx

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -24,22 +24,16 @@ import {
2424
DialogHeader,
2525
} from '@catena-x/portal-shared-components'
2626
import { show } from 'features/control/overlay'
27-
import { fetchItems } from 'features/info/news/actions'
28-
import { itemsSelector } from 'features/info/news/slice'
27+
import { useGetItemsQuery } from 'features/info/news/apiSlice'
2928
import type { AppDispatch } from 'features/store'
30-
import { useEffect } from 'react'
3129
import { useTranslation } from 'react-i18next'
32-
import { useDispatch, useSelector } from 'react-redux'
30+
import { useDispatch } from 'react-redux'
3331
import { OVERLAYS } from 'types/Constants'
3432

3533
export default function NewsDetail({ id }: { id: string }) {
3634
const { t } = useTranslation()
35+
const { data: items = [] } = useGetItemsQuery()
3736
const dispatch = useDispatch<AppDispatch>()
38-
const items = useSelector(itemsSelector)
39-
40-
useEffect(() => {
41-
dispatch(fetchItems())
42-
}, [dispatch])
4337

4438
return (
4539
<>

src/components/pages/Home/NewsSection/index.tsx

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -19,20 +19,11 @@
1919
********************************************************************************/
2020

2121
import { Cards } from '@catena-x/portal-shared-components'
22-
import { useEffect } from 'react'
23-
import { useDispatch, useSelector } from 'react-redux'
24-
import { fetchItems } from 'features/info/news/actions'
25-
import { itemsSelector } from 'features/info/news/slice'
2622
import './style.scss'
27-
import type { AppDispatch } from 'features/store'
23+
import { useGetItemsQuery } from 'features/info/news/apiSlice'
2824

2925
export default function NewsSection() {
30-
const dispatch = useDispatch<AppDispatch>()
31-
const items = useSelector(itemsSelector)
32-
33-
useEffect(() => {
34-
dispatch(fetchItems())
35-
}, [dispatch])
26+
const { data: items = [] } = useGetItemsQuery()
3627

3728
return (
3829
<section className="news-section">

src/features/info/news/actions.ts

Lines changed: 0 additions & 34 deletions
This file was deleted.
Lines changed: 14 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
/********************************************************************************
2-
* Copyright (c) 2023 BMW Group AG
3-
* Copyright (c) 2023 Contributors to the Eclipse Foundation
2+
* Copyright (c) 2025 Contributors to the Eclipse Foundation
43
*
54
* See the NOTICE file(s) distributed with this work for additional
65
* information regarding copyright ownership.
@@ -18,24 +17,20 @@
1817
* SPDX-License-Identifier: Apache-2.0
1918
********************************************************************************/
2019

20+
import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react'
2121
import type { CardItems } from '@catena-x/portal-shared-components'
2222
import { getAssetBase } from 'services/EnvironmentService'
23-
import { HttpClient } from 'utils/httpClient'
2423

25-
export class Api extends HttpClient {
26-
private static classInstance?: Api
24+
export const apiSlice = createApi({
25+
reducerPath: 'rtk/newsApi',
26+
baseQuery: fetchBaseQuery({
27+
baseUrl: getAssetBase(),
28+
}),
29+
endpoints: (builder) => ({
30+
getItems: builder.query<CardItems[], void>({
31+
query: () => '/api/news/latest.json',
32+
}),
33+
}),
34+
})
2735

28-
public constructor() {
29-
super(getAssetBase())
30-
}
31-
32-
public static getInstance() {
33-
if (!this.classInstance) {
34-
this.classInstance = new Api()
35-
}
36-
return this.classInstance
37-
}
38-
39-
public getItems = () =>
40-
this.instance.get<CardItems[]>('/api/news/latest.json')
41-
}
36+
export const { useGetItemsQuery } = apiSlice

src/features/info/news/slice.ts

Lines changed: 25 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -20,40 +20,44 @@
2020

2121
import { createSlice } from '@reduxjs/toolkit'
2222
import type { CardItems } from '@catena-x/portal-shared-components'
23-
import type { RootState } from 'features/store'
23+
import { type RootState } from 'features/store'
2424
import { RequestState } from 'types/MainTypes'
25-
import { fetchItems } from './actions'
25+
import { apiSlice } from './apiSlice'
2626
import { initialState, name } from './types'
2727

2828
export const slice = createSlice({
2929
name,
3030
initialState,
3131
reducers: {},
3232
extraReducers: (builder) => {
33-
builder.addCase(fetchItems.pending, (state) => ({
34-
...state,
35-
items: [],
36-
request: RequestState.SUBMIT,
37-
error: '',
38-
}))
39-
builder.addCase(fetchItems.fulfilled, (state, { payload }) => ({
40-
...state,
41-
items: payload || [],
42-
request: RequestState.OK,
43-
error: '',
44-
}))
45-
builder.addCase(fetchItems.rejected, (state, action) => ({
46-
...state,
47-
items: [],
48-
request: RequestState.ERROR,
49-
error: action.error.message!,
50-
}))
33+
builder
34+
.addMatcher(apiSlice.endpoints.getItems.matchPending, (state) => {
35+
state.items = []
36+
state.request = RequestState.SUBMIT
37+
state.error = ''
38+
})
39+
.addMatcher(
40+
apiSlice.endpoints.getItems.matchFulfilled,
41+
(state, { payload }) => {
42+
state.items = payload ?? []
43+
state.request = RequestState.OK
44+
state.error = ''
45+
}
46+
)
47+
.addMatcher(
48+
apiSlice.endpoints.getItems.matchRejected,
49+
(state, { error }) => {
50+
state.items = []
51+
state.request = RequestState.ERROR
52+
state.error = error.message ?? ''
53+
}
54+
)
5155
},
5256
})
5357

5458
export const itemsSelector = (state: RootState): CardItems[] =>
5559
state.info.news.items
5660

57-
const Slice = { slice }
61+
export const Slice = { slice }
5862

5963
export default Slice

src/features/info/search/actions.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import { createAction, createAsyncThunk } from '@reduxjs/toolkit'
2222
import { apiSlice as PartnerNetworkApiSlice } from '../../partnerNetwork/apiSlice'
2323
import { Api as AppsApi } from 'features/apps/marketplaceDeprecated/api'
2424
import { Api as UserApi } from 'features/admin/userDeprecated/api'
25-
import { Api as NewsApi } from 'features/info/news/api'
25+
import { apiSlice as NewsApi } from 'features/info/news/apiSlice'
2626
import {
2727
actionToSearchItem,
2828
appToSearchItem,
@@ -150,8 +150,12 @@ const searchForExpression = async function (expr: string) {
150150
)
151151
.unwrap()
152152
.catch(() => emptyPartnerResult),
153-
NewsApi.getInstance()
154-
.getItems()
153+
store
154+
.dispatch(NewsApi.endpoints.getItems.initiate())
155+
.unwrap()
156+
.then((response: CardItems[]) => {
157+
return response
158+
})
155159
.catch(() => emptyNewsResult),
156160
UserApi.getInstance()
157161
.getTenantUsers()

src/features/store.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ import { apiSlice as partnerNetworkApiSlice } from './partnerNetwork/apiSlice'
6060
import { apiSlice as partnerNetworkPortalApiSlice } from './newPartnerNetwork/partnerNetworkPortalApiSlice'
6161
import { apiSlice as connectorApiSlice } from './connector/connectorApiSlice'
6262
import { apiSlice as serviceManagementApiSlice } from './serviceManagement/apiSlice'
63+
import { apiSlice as newsApiSlice } from './info/news/apiSlice'
6364
import serviceSubscriptionSlice from './serviceSubscription/slice'
6465
import { apiSlice as serviceSubscriptionApiSlice } from './serviceSubscription/serviceSubscriptionApiSlice'
6566
import { apiSlice as serviceAdminBoardApiSlice } from './adminBoard/serviceAdminBoardApiSlice'
@@ -125,6 +126,7 @@ export const reducers = {
125126
[connectorApiSlice.reducerPath]: connectorApiSlice.reducer,
126127
[semanticApiSlice.reducerPath]: semanticApiSlice.reducer,
127128
[serviceManagementApiSlice.reducerPath]: serviceManagementApiSlice.reducer,
129+
[newsApiSlice.reducerPath]: newsApiSlice.reducer,
128130
[serviceSubscriptionApiSlice.reducerPath]:
129131
serviceSubscriptionApiSlice.reducer,
130132
[serviceAdminBoardApiSlice.reducerPath]: serviceAdminBoardApiSlice.reducer,
@@ -165,6 +167,7 @@ export const store = configureStore({
165167
.concat(connectorApiSlice.middleware)
166168
.concat(semanticApiSlice.middleware)
167169
.concat(serviceManagementApiSlice.middleware)
170+
.concat(newsApiSlice.middleware)
168171
.concat(serviceSubscriptionApiSlice.middleware)
169172
.concat(serviceAdminBoardApiSlice.middleware)
170173
.concat(companyRoleApiSlice.middleware)

0 commit comments

Comments
 (0)