Skip to content

Commit f1f90f8

Browse files
Bugfix/cg 4432 sorting doesnt work when logged in (#35)
2 parents 408ec2a + 992ea92 commit f1f90f8

File tree

3 files changed

+114
-54
lines changed

3 files changed

+114
-54
lines changed

samples/musicfestival-frontend-react/src/components/Header.tsx

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { useState } from 'react';
1+
import { useEffect, useState } from 'react';
22
import authService from '../authService';
33
import LoginButton from './LoginButton';
44
import LogoutButton from './LogoutButton';
@@ -7,12 +7,14 @@ function Header() {
77
const [isLoggedIn, setIsLoggedIn] = useState(false);
88
const [username, setUsername] = useState("");
99

10-
authService.getUser().then((user) => {
11-
if (user && !user.expired) {
12-
setIsLoggedIn(true);
13-
setUsername(user.profile.name || "");
14-
}
15-
});
10+
useEffect(() => {
11+
authService.getUser().then((user) => {
12+
if (user && !user.expired) {
13+
setIsLoggedIn(true);
14+
setUsername(user.profile.name || "");
15+
}
16+
});
17+
}, [])
1618

1719
return (
1820
<nav className="Page-container LoginBar">

samples/musicfestival-frontend-react/src/helpers/queryCacheHelper.ts

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { QueryClient } from "@tanstack/react-query";
2-
import { Locales, StartQuery } from "../generated";
2+
import { ArtistSearchQuery, Locales, StartQuery } from "../generated";
33
import { ContentSavedMessage } from "../models/ContentSavedMessage";
44
import { extractParams, isEditOrPreviewMode } from "./urlHelper";
55

@@ -21,10 +21,29 @@ const generateGQLSearchQueryVars = (token: string, pathname: string, searchParam
2121
if (isEditOrPreviewMode() && token) {
2222
variables = { locales: locales as Locales, searchParam, sortOption };
2323
}
24-
24+
2525
return variables
2626
}
2727

28+
const updateSearchQueryCache = (queryClient: QueryClient, data: StartQuery | undefined, variables: any, message: ContentSavedMessage) => {
29+
const hasComplexProperty = message.properties.find(p => !isSimpleProperty(p.value)) !== undefined
30+
if (hasComplexProperty) {
31+
queryClient.invalidateQueries(['ArtistSearch', variables]);
32+
return;
33+
}
34+
35+
const newContent = updateSearchQueryData({ ...data }, message);
36+
queryClient.setQueryData(['ArtistSearch', variables], newContent);
37+
}
38+
39+
function updateSearchQueryData(data: ArtistSearchQuery, message: ContentSavedMessage) {
40+
if (!data.ArtistDetailsPage?.items || !data.ArtistDetailsPage?.items || data.ArtistDetailsPage?.items?.length === 0) { return; }
41+
const content = data.ArtistDetailsPage?.items[0];
42+
message.properties.forEach((prop) => updateContentProperty(content, prop.name, prop.value));
43+
44+
return data;
45+
}
46+
2847
const updateStartQueryCache = (queryClient: QueryClient, data: StartQuery | undefined, variables: any, message: ContentSavedMessage) => {
2948
const hasComplexProperty = message.properties.find(p => !isSimpleProperty(p.value)) !== undefined
3049
if (hasComplexProperty) {
@@ -67,4 +86,4 @@ function isSimpleProperty(propValue: any) {
6786
}
6887

6988

70-
export { generateGQLQueryVars, updateStartQueryCache, generateGQLSearchQueryVars }
89+
export { generateGQLQueryVars, updateStartQueryCache, generateGQLSearchQueryVars, updateSearchQueryCache }

samples/musicfestival-frontend-react/src/pages/SearchPage.tsx

Lines changed: 83 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,26 @@
1-
import { useState } from "react";
1+
import { memo, useCallback, useEffect, useState } from "react";
22
import { useSearchParams } from "react-router-dom";
33
import Footer from "../components/Footer";
44
import Header from "../components/Header";
55
import SearchButton from "../components/SearchButton";
66
import { ArtistAutocompleteQuery, ArtistSearchQuery, OtherContentSearchQuery, useArtistAutocompleteQuery, useArtistSearchQuery, useOtherContentSearchQuery } from "../generated";
7-
import { generateGQLSearchQueryVars } from "../helpers/queryCacheHelper";
7+
import { generateGQLSearchQueryVars, updateSearchQueryCache } from "../helpers/queryCacheHelper";
88
import { getImageUrl, isEditOrPreviewMode } from "../helpers/urlHelper";
99
import ReactPaginate from 'react-paginate';
10+
import { useMutation, useQueryClient } from "@tanstack/react-query";
11+
import { ContentSavedMessage } from "../models/ContentSavedMessage";
12+
import authService from "../authService";
13+
import { subcribeContentSavedEvent } from "../helpers/contentSavedEvent";
14+
15+
let previousSavedMessage: any = null;
16+
const singleKeyUrl = process.env.REACT_APP_CONTENT_GRAPH_GATEWAY_URL as string
17+
const hmacKeyUrl = process.env.REACT_APP_CG_PROXY_URL as string
1018

1119
function SearchPage() {
12-
const singleKeyUrl = process.env.REACT_APP_CONTENT_GRAPH_GATEWAY_URL as string
20+
console.log("Start")
21+
const queryClient = useQueryClient()
1322
const ARTIST = "Artist"
1423
const OTHERCONTENT = "OtherContent"
15-
const options: string[] = ["ASC", "DESC"]
16-
const itemsPerPageOptions: number[] = [10, 15]
17-
const filterByOption: {value: string; key: string}[] = [
18-
{value: "Artists", key: ARTIST},
19-
{value: "Other Content", key: OTHERCONTENT}
20-
]
2124

2225
const [token, setToken] = useState("")
2326
const [itemOffset, setItemOffset] = useState(0)
@@ -26,6 +29,9 @@ function SearchPage() {
2629
const [otherItemsPerPage, setOtherItemsPerPage] = useState(10)
2730
const [orderBy, setOrderBy] = useState("ASC")
2831
const [searchParams] = useSearchParams()
32+
const endOffset = itemOffset + itemsPerPage
33+
const endOffsetOther = otherItemOffset + otherItemsPerPage
34+
const modeEdit = isEditOrPreviewMode()
2935
let queryString = searchParams.get("q") ?? ""
3036
let filterQueryString = searchParams.get("f") ?? ""
3137
const [filterBy, setFilterBy] = useState(filterQueryString ?? ARTIST)
@@ -35,57 +41,90 @@ function SearchPage() {
3541
let autocompleteData : ArtistAutocompleteQuery | undefined = undefined
3642
let resultNumber : number
3743
let otherResultNumber : number
44+
let variables: any
45+
let options: string[] = ["ASC", "DESC"]
46+
let itemsPerPageOptions: number[] = [10, 15]
47+
let filterByOption: {value: string; key: string}[] = [
48+
{value: "Artists", key: "Artist"},
49+
{value: "Other Content", key: "OtherContent"}
50+
]
3851

39-
let modeEdit = isEditOrPreviewMode()
40-
let variables = generateGQLSearchQueryVars(token, window.location.pathname, queryString, orderBy);
41-
let endOffset = itemOffset + itemsPerPage
42-
let endOffsetOther = otherItemOffset + otherItemsPerPage
52+
let headers = {}
53+
let url = singleKeyUrl
4354

44-
const { data : searchQueryData } = useArtistSearchQuery({ endpoint: singleKeyUrl }, variables, { staleTime: 2000, enabled: !modeEdit || !!token });
55+
const { mutate } = useMutation((obj: any) => obj, {
56+
onSuccess: (message: ContentSavedMessage) => {
57+
if (previousSavedMessage !== message) {
58+
previousSavedMessage = message;
59+
updateSearchQueryCache(queryClient, artistData, variables, message)
60+
}
61+
}
62+
})
63+
64+
useEffect(() => {
65+
authService.getAccessToken().then((_token) => {
66+
_token && setToken(_token)
67+
modeEdit && !_token && !artistData && authService.login()
68+
})
69+
}, [])
70+
71+
if (modeEdit) {
72+
if (token) {
73+
headers = { 'Authorization': 'Bearer ' + token }
74+
}
75+
url = hmacKeyUrl
76+
subcribeContentSavedEvent((message: any) => mutate(message))
77+
}
78+
79+
variables = generateGQLSearchQueryVars(token, window.location.pathname, queryString, orderBy)
80+
81+
const { data : searchQueryData } = useArtistSearchQuery({ endpoint: url, fetchParams: { headers: headers } }, variables, { staleTime: 2000, enabled: !modeEdit || !!token })
4582
artistData = searchQueryData
4683
resultNumber = artistData?.ArtistDetailsPage?.items?.length ?? 0
47-
const currentItems = artistData?.ArtistDetailsPage?.items?.slice(itemOffset, endOffset);
48-
const pageCount = Math.ceil(resultNumber / itemsPerPage);
84+
const currentItems = artistData?.ArtistDetailsPage?.items?.slice(itemOffset, endOffset)
85+
const pageCount = Math.ceil(resultNumber / itemsPerPage)
4986

50-
const { data : otherContentSearchQueryData } = useOtherContentSearchQuery({ endpoint: singleKeyUrl }, variables, { staleTime: 2000, enabled: !modeEdit || !!token });
87+
const { data : otherContentSearchQueryData } = useOtherContentSearchQuery({ endpoint: url, fetchParams: { headers: headers } }, variables, { staleTime: 2000, enabled: !modeEdit || !!token })
5188
otherData = otherContentSearchQueryData
5289
otherResultNumber = otherData?.Content?.items?.length ?? 0
53-
const currentOtherItems = otherData?.Content?.items?.slice(otherItemOffset, endOffsetOther);
54-
const pageOtherCount = Math.ceil(otherResultNumber / itemsPerPage);
90+
const currentOtherItems = otherData?.Content?.items?.slice(otherItemOffset, endOffsetOther)
91+
const pageOtherCount = Math.ceil(otherResultNumber / itemsPerPage)
5592

56-
const { data : artistAutocompleteData } = useArtistAutocompleteQuery({ endpoint: singleKeyUrl }, variables, { staleTime: 2000, enabled: !modeEdit || !!token })
93+
const { data : artistAutocompleteData } = useArtistAutocompleteQuery({ endpoint: url, fetchParams: { headers: headers } }, variables, { staleTime: 2000, enabled: !modeEdit || !!token })
5794
autocompleteData = artistAutocompleteData
5895

5996
const handlePageClick = (event: any) => {
60-
const newOffset = (event.selected * itemsPerPage) % resultNumber;
61-
setItemOffset(newOffset);
62-
};
97+
const newOffset = (event.selected * itemsPerPage) % resultNumber
98+
setItemOffset(newOffset)
99+
}
63100

64101
const handleItemsChange = (event: any) => {
65-
setItemsPerPage(event.target.value);
66-
};
102+
setItemsPerPage(event.target.value)
103+
}
67104

68105
const handleOtherPageClick = (event: any) => {
69-
const newOffset = (event.selected * itemsPerPage) % otherResultNumber;
70-
setOtherItemOffset(newOffset);
71-
};
106+
const newOffset = (event.selected * itemsPerPage) % otherResultNumber
107+
setOtherItemOffset(newOffset)
108+
}
72109

73110
const handleOtherItemsChange = (event: any) => {
74-
setOtherItemsPerPage(event.target.value);
75-
};
76-
77-
const handleFilterByChange = (event : any) => {
78-
setFilterBy(event.target.value)
79-
};
111+
setOtherItemsPerPage(event.target.value)
112+
}
80113

81114
const handleChange = (event: any) => {
82-
setOrderBy(event.target.value);
115+
setOrderBy(event.target.value)
83116
}
84117

85118
const handleFacetClick = (event: any) => {
86119
window.location.href = `${window.location.origin}/search?q=${event.target.innerText}&f=${filterBy}`
87120
}
88121

122+
const handleFilterByChange = (event : any) => {
123+
setFilterBy(event.target.value)
124+
//setOtherItemsPerPage(event.target.value)
125+
}
126+
127+
89128
return (
90129
<div>
91130
<Header />
@@ -136,7 +175,7 @@ function SearchPage() {
136175
artistData?.ArtistDetailsPage?.facets?.StageName?.map((artist, idx) => {
137176
return (
138177
<div key={idx} className="facet-item">
139-
<a key={artist?.name} onClick={(event) => handleFacetClick(event)}>
178+
<a onClick={(event) => handleFacetClick(event)}>
140179
<span>{artist?.name}</span>
141180
</a>
142181
<b>{artist?.count}</b>
@@ -151,7 +190,7 @@ function SearchPage() {
151190
otherData?.Content?.facets?.Name?.map((content, idx) => {
152191
return (
153192
<div key={idx} className="facet-item">
154-
<a key={content?.name} onClick={(event) => handleFacetClick(event)}>
193+
<a onClick={(event) => handleFacetClick(event)}>
155194
<span>{content?.name}</span>
156195
</a>
157196
<b>{content?.count}</b>
@@ -208,21 +247,21 @@ function SearchPage() {
208247
<h6>People also search for: </h6>
209248
<br></br>
210249
{
211-
autocompleteData?.ArtistDetailsPage?.autocomplete?.ArtistName?.map((name) => {
250+
autocompleteData?.ArtistDetailsPage?.autocomplete?.ArtistName?.map((name, idx) => {
212251
return (
213-
<div>
214-
<a key={name} onClick={(event) => handleFacetClick(event)}>
252+
<div key={idx}>
253+
<a onClick={(event) => handleFacetClick(event)}>
215254
<i>{name}</i>
216255
</a>
217256
</div>
218257
)
219258
})
220259
}
221260
{
222-
autocompleteData?.ArtistDetailsPage?.autocomplete?.StageName?.map((name) => {
261+
autocompleteData?.ArtistDetailsPage?.autocomplete?.StageName?.map((name, idx) => {
223262
return (
224-
<div>
225-
<a key={name} onClick={(event) => handleFacetClick(event)}>
263+
<div key={idx}>
264+
<a onClick={(event) => handleFacetClick(event)}>
226265
<i>{name}</i>
227266
</a>
228267
</div>
@@ -326,4 +365,4 @@ function SearchPage() {
326365
);
327366
}
328367

329-
export default SearchPage;
368+
export default memo(SearchPage);

0 commit comments

Comments
 (0)