Skip to content

Commit 7c5feb8

Browse files
authored
Merge pull request #257 from map-of-pi/reviews-revamp
Approved (1).
2 parents a303a4a + 63eecbe commit 7c5feb8

File tree

11 files changed

+100
-89
lines changed

11 files changed

+100
-89
lines changed

context/AppContextProvider.tsx

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,16 +23,20 @@ interface IAppContextProps {
2323
currentUser: IUser | null;
2424
setCurrentUser: React.Dispatch<SetStateAction<IUser | null>>;
2525
registerUser: () => void;
26-
autoLoginUser:()=> void,
27-
isSigningInUser: boolean
26+
autoLoginUser: ()=> void;
27+
isSigningInUser: boolean;
28+
reload: boolean;
29+
setReload: React.Dispatch<SetStateAction<boolean>>;
2830
}
2931

3032
const initialState: IAppContextProps = {
3133
currentUser: null,
3234
setCurrentUser: () => {},
3335
registerUser: () => { },
34-
autoLoginUser:()=> {},
35-
isSigningInUser:false
36+
autoLoginUser: ()=> {},
37+
isSigningInUser: false,
38+
reload: false,
39+
setReload: () => {},
3640
};
3741

3842
export const AppContext = createContext<IAppContextProps>(initialState);
@@ -45,6 +49,7 @@ const AppContextProvider = ({ children }: AppContextProviderProps) => {
4549
const t = useTranslations();
4650
const [currentUser, setCurrentUser] = useState<IUser | null>(null);
4751
const [isSigningInUser, setIsSigningInUser] = useState(false);
52+
const [reload, setReload] = useState(false);
4853

4954
const registerUser = async () => {
5055
logger.info('Initializing Pi SDK for user registration.');
@@ -111,7 +116,7 @@ const AppContextProvider = ({ children }: AppContextProviderProps) => {
111116
}, []);
112117

113118
return (
114-
<AppContext.Provider value={{ currentUser, setCurrentUser, registerUser, autoLoginUser, isSigningInUser }}>
119+
<AppContext.Provider value={{ currentUser, setCurrentUser, registerUser, autoLoginUser, isSigningInUser, reload, setReload }}>
115120
{children}
116121
</AppContext.Provider>
117122
);

messages/en-GB.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@
104104
"FEEDBACK_PHOTO_UPLOAD_LABEL": "Feedback photo upload",
105105
"VALIDATION": {
106106
"LOADING_REVIEW_FAILURE": "Error loading review",
107-
"SELF_REVIEW_PROHIBITED": "Self-review is prohibited"
107+
"SELF_REVIEW_NOT_POSSIBLE": "Self-review is not possible"
108108
}
109109
}
110110
},

messages/en.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@
105105
"FEEDBACK_PHOTO_UPLOAD_LABEL": "Feedback photo upload",
106106
"VALIDATION": {
107107
"LOADING_REVIEW_FAILURE": "Error loading review",
108-
"SELF_REVIEW_PROHIBITED": "Self-review is prohibited"
108+
"SELF_REVIEW_NOT_POSSIBLE": "Self-review is not possible"
109109
}
110110
}
111111
},

messages/es.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@
104104
"FEEDBACK_PHOTO_UPLOAD_LABEL": "Subir foto de retroalimentación",
105105
"VALIDATION": {
106106
"LOADING_REVIEW_FAILURE": "Error al cargar la reseña",
107-
"SELF_REVIEW_PROHIBITED": "La autoevaluación está prohibida"
107+
"SELF_REVIEW_NOT_POSSIBLE": "No es posible autoevaluarse"
108108
}
109109
}
110110
},

messages/ewe-BJ.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@
104104
"FEEDBACK_PHOTO_UPLOAD_LABEL": "Photo na vovɔ",
105105
"VALIDATION": {
106106
"LOADING_REVIEW_FAILURE": "Dzudzɔmenyã meyinaa nuwò dzi o",
107-
"SELF_REVIEW_PROHIBITED": "Wòdzɔ wò nɔnɔ kple wòkplɔ míaɖu o"
107+
"SELF_REVIEW_NOT_POSSIBLE": "Metsɔ eme eŋu srɔ ŋgɔmetɔ ƒe yiwo"
108108
}
109109
}
110110
},

messages/hau-NG.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@
104104
"FEEDBACK_PHOTO_UPLOAD_LABEL": "Loda Hoto Martani",
105105
"VALIDATION": {
106106
"LOADING_REVIEW_FAILURE": "Kuskure wajen ɗaukar bita",
107-
"SELF_REVIEW_PROHIBITED": "Binciken kai an hana"
107+
"SELF_REVIEW_NOT_POSSIBLE": "Ba zai yiwu ka duba kanka ba"
108108
}
109109
}
110110
},

messages/ko.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@
104104
"FEEDBACK_PHOTO_UPLOAD_LABEL": "피드백 사진 업로드",
105105
"VALIDATION": {
106106
"LOADING_REVIEW_FAILURE": "리뷰 로딩 오류",
107-
"SELF_REVIEW_PROHIBITED": "자기 평가는 금지되어 있습니다"
107+
"SELF_REVIEW_NOT_POSSIBLE": "자기 평가가 불가능합니다"
108108
}
109109
}
110110
},

src/app/[locale]/seller/reviews/[id]/page.tsx

Lines changed: 65 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -43,12 +43,11 @@ function SellerReviews({
4343
const userId = params.id;
4444

4545
const [giverReviews, setGiverReviews] = useState<ReviewInt[] | null>(null);
46-
const [receiverReviews, setReciverReviews] = useState<ReviewInt[] | null>(null);
47-
const [searchLoading, setSearchLoading] = useState<boolean>(false);
46+
const [receiverReviews, setReceiverReviews] = useState<ReviewInt[] | null>(null);
4847
const [loading, setLoading] = useState<boolean>(true);
4948
const [error, setError] = useState<string | null>(null);
5049
const [isSaveEnabled, setIsSaveEnabled] = useState(false);
51-
const { currentUser } = useContext(AppContext);
50+
const { currentUser, setReload, reload } = useContext(AppContext);
5251
const inputRef = useRef<HTMLInputElement>(null);
5352
const [searchBarValue, setSearchBarValue] = useState('');
5453

@@ -95,17 +94,18 @@ function SellerReviews({
9594
logger.info(`Fetched ${data.length} reviews for seller ID: ${userId}`);
9695
const { giverReviews, receiverReviews } = processReviews(data, userId);
9796
setGiverReviews(giverReviews);
98-
setReciverReviews(receiverReviews);
97+
setReceiverReviews(receiverReviews);
9998
} else {
10099
logger.warn(`No reviews found for seller ID: ${userId}`);
101100
setGiverReviews([]);
102-
setReciverReviews([]);
101+
setReceiverReviews([]);
103102
}
104103
} catch (error) {
105104
logger.error(`Error fetching reviews for seller ID: ${userId}`, { error });
106105
setError('Error fetching reviews. Please try again later.');
107106
} finally {
108107
setLoading(false);
108+
setReload(false)
109109
}
110110
};
111111

@@ -114,7 +114,7 @@ function SellerReviews({
114114

115115
// Handle search logic
116116
const handleSearch = async () => {
117-
setSearchLoading(true);
117+
setReload(true);
118118
try {
119119
logger.info(`Searching reviews for seller ID: ${userId} with query: ${searchBarValue}`);
120120
const data = await fetchReviews(userId, searchBarValue);
@@ -123,17 +123,17 @@ function SellerReviews({
123123
logger.info(`Found ${data.length} reviews for seller ID: ${userId}`);
124124
const { giverReviews, receiverReviews } = processReviews(data, userId);
125125
setGiverReviews(giverReviews);
126-
setReciverReviews(receiverReviews);
126+
setReceiverReviews(receiverReviews);
127127
} else {
128128
logger.warn(`No reviews found for seller ID: ${userId} with query: ${searchBarValue}`);
129129
setGiverReviews([]);
130-
setReciverReviews([]);
130+
setReceiverReviews([]);
131131
}
132132
} catch (error) {
133133
logger.error(`Error searching reviews for seller ID: ${userId}`, { error });
134134
setError('Error searching reviews. Please try again later.');
135135
} finally {
136-
setSearchLoading(false);
136+
setReload(false);
137137
}
138138
};
139139

@@ -157,7 +157,7 @@ function SellerReviews({
157157

158158
{/* Search area */}
159159
<div className='flex gap-3 items-center justify-items-center py-3'>
160-
<span>{t('SHARED.PIONEER_LABEL')}</span>
160+
<span>{t('SHARED.PIONEER_LABEL')}</span>
161161
<FormControl className="flex-grow mr-2">
162162
<TextField
163163
id="search-input"
@@ -180,21 +180,61 @@ function SellerReviews({
180180
<SearchIcon className="text-[#ffc153]" />
181181
</button>
182182
</div>
183-
184-
{searchLoading && (<div className='text-center text-primary text-lg'>
185-
{t('SHARED.SEARCH_LOADING')}
186-
</div>)
187-
}
188183

189184
<ToggleCollapse header={t('SCREEN.REVIEWS.GIVE_REVIEW_SECTION_HEADER')}>
190185
<div>
191-
<EmojiPicker sellerId={userId} setIsSaveEnabled={setIsSaveEnabled} currentUser={currentUser} />
186+
<EmojiPicker sellerId={userId} setIsSaveEnabled={setIsSaveEnabled} currentUser={currentUser} setReload={setReload} />
192187
</div>
193-
</ToggleCollapse>
194-
188+
</ToggleCollapse>
195189
<ToggleCollapse header={t('SCREEN.REVIEWS.REVIEWS_GIVEN_SECTION_HEADER')}>
196-
197-
{giverReviews && giverReviews.map((review, index) => (
190+
{reload
191+
? <Skeleton type='seller_review' />
192+
: giverReviews && giverReviews.map((review, index) => (
193+
<div key={index} className="seller_item_container mb-5">
194+
<div className="flex justify-between items-start mb-3">
195+
{/* Left content */}
196+
<div className="flex-grow">
197+
<p className="text-primary text-sm">
198+
{review.giver} {' -> '}
199+
<span className="text-primary text-sm">{review.receiver}</span>
200+
</p>
201+
<p className="text-md break-words">{review.heading}</p>
202+
</div>
203+
204+
{/* Right content */}
205+
<div className="flex flex-col items-end space-y-2">
206+
<div className="text-[#828282] text-sm text-right whitespace-nowrap">
207+
<p>{review.date}</p>
208+
<p>{review.time}</p>
209+
</div>
210+
<div className="flex gap-2 items-center">
211+
<Image
212+
src={review.image}
213+
alt="emoji image"
214+
width={50}
215+
height={50}
216+
className="object-cover rounded-md"
217+
/>
218+
<p className="text-xl max-w-[50px]" title={review.reaction}>
219+
{review.unicode}
220+
</p>
221+
</div>
222+
<div className="flex justify-between items-center">
223+
<Link href={`/seller/reviews/feedback/${review.reviewId}?seller_name=${review.giver}`}>
224+
<OutlineBtn label={t('SHARED.REPLY')} />
225+
</Link>
226+
</div>
227+
</div>
228+
</div>
229+
</div>
230+
))
231+
}
232+
</ToggleCollapse>
233+
234+
<ToggleCollapse header={t('SCREEN.REVIEWS.REVIEWS_RECEIVED_SECTION_HEADER')} open={true}>
235+
{reload
236+
? <Skeleton type='seller_review' />
237+
: receiverReviews && receiverReviews.map((review, index) => (
198238
<div key={index} className="seller_item_container mb-5">
199239
<div className="flex justify-between items-start mb-3">
200240
{/* Left content */}
@@ -220,7 +260,9 @@ function SellerReviews({
220260
height={50}
221261
className="object-cover rounded-md"
222262
/>
223-
<p className="text-xl max-w-[50px]">{review.unicode}</p>
263+
<p className="text-xl max-w-[50px]" title={review.reaction}>
264+
{review.unicode}
265+
</p>
224266
</div>
225267
<div className="flex justify-between items-center">
226268
<Link href={`/seller/reviews/feedback/${review.reviewId}?seller_name=${review.giver}`}>
@@ -230,47 +272,8 @@ function SellerReviews({
230272
</div>
231273
</div>
232274
</div>
233-
))}
234-
</ToggleCollapse>
235-
236-
<ToggleCollapse header={t('SCREEN.REVIEWS.REVIEWS_RECEIVED_SECTION_HEADER')} open={true}>
237-
{receiverReviews && receiverReviews.map((review, index) => (
238-
<div key={index} className="seller_item_container mb-5">
239-
<div className="flex justify-between items-start mb-3">
240-
{/* Left content */}
241-
<div className="flex-grow">
242-
<p className="text-primary text-sm">
243-
{review.giver} {' -> '}
244-
<span className="text-primary text-sm">{review.receiver}</span>
245-
</p>
246-
<p className="text-md break-words">{review.heading}</p>
247-
</div>
248-
249-
{/* Right content */}
250-
<div className="flex flex-col items-end space-y-2">
251-
<div className="text-[#828282] text-sm text-right whitespace-nowrap">
252-
<p>{review.date}</p>
253-
<p>{review.time}</p>
254-
</div>
255-
<div className="flex gap-2 items-center">
256-
<Image
257-
src={review.image}
258-
alt="emoji image"
259-
width={50}
260-
height={50}
261-
className="object-cover rounded-md"
262-
/>
263-
<p className="text-xl max-w-[50px]">{review.unicode}</p>
264-
</div>
265-
<div className="flex justify-between items-center">
266-
<Link href={`/seller/reviews/feedback/${review.reviewId}?seller_name=${review.giver}`}>
267-
<OutlineBtn label={t('SHARED.REPLY')} />
268-
</Link>
269-
</div>
270-
</div>
271-
</div>
272-
</div>
273-
))}
275+
))
276+
}
274277
</ToggleCollapse>
275278
</div>
276279
</>

src/app/[locale]/seller/reviews/feedback/[id]/page.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,9 @@ export default function ReplyToReviewPage({ params, searchParams }: ReplyToRevie
172172
height={50}
173173
className="object-cover rounded-md"
174174
/>
175-
<p className="text-xl max-w-[50px]">{review.unicode}</p>
175+
<p className="text-xl max-w-[50px]" title={review.reaction}>
176+
{review.unicode}
177+
</p>
176178
</div>
177179
</div>
178180
</div>

src/components/shared/Review/emojipicker.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ export default function EmojiPicker(props: any) {
9595
if (props.currentUser) {
9696
if (props.currentUser.pi_uid === props.sellerId) {
9797
logger.warn(`Attempted self review by user ${props.currentUser.pi_uid}`);
98-
toast.error(t('SCREEN.REPLY_TO_REVIEW.VALIDATION.SELF_REVIEW_PROHIBITED'));
98+
toast.error(t('SCREEN.REPLY_TO_REVIEW.VALIDATION.SELF_REVIEW_NOT_POSSIBLE'));
9999
}
100100
if (reviewEmoji === null) {
101101
logger.warn('Attempted to save review without selecting an emoji.');

0 commit comments

Comments
 (0)