Skip to content

Commit 8b9ebc6

Browse files
authored
Merge pull request #377 from map-of-pi/dev
Approved for deployment.
2 parents c0d467f + 9332881 commit 8b9ebc6

File tree

3 files changed

+150
-111
lines changed

3 files changed

+150
-111
lines changed

src/app/[locale]/seller/registration/page.tsx

+55-41
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import { itemData } from '@/constants/demoAPI';
2121
import { IUserSettings, ISeller, FulfillmentType } from '@/constants/types';
2222
import { fetchSellerRegistration, registerSeller } from '@/services/sellerApi';
2323
import { fetchUserSettings } from '@/services/userSettingsApi';
24+
import { fetchToggle } from '@/services/toggleApi';
2425
import { checkAndAutoLoginUser } from '@/utils/auth';
2526
import removeUrls from '../../../../utils/sanitize';
2627
import { AppContext } from '../../../../../context/AppContextProvider';
@@ -74,6 +75,7 @@ const SellerRegistrationForm = () => {
7475
const [isFormValid, setIsFormValid] = useState(false);
7576
const [isSaveEnabled, setIsSaveEnabled] = useState(false);
7677
const [showConfirmDialog, setShowConfirmDialog] = useState(false);
78+
const [isOnlineShoppingEnabled, setOnlineShoppingEnabled] = useState(false);
7779
const [linkUrl, setLinkUrl] = useState('');
7880

7981
// Fetch seller data and user settings on component mount
@@ -111,8 +113,18 @@ const SellerRegistrationForm = () => {
111113
}
112114
};
113115

116+
const getToggleData = async () => {
117+
try {
118+
const toggle = await fetchToggle('onlineShoppingFeature');
119+
setOnlineShoppingEnabled(toggle.enabled);
120+
} catch (error) {
121+
logger.error('Error fetching toggle:', error);
122+
}
123+
};
124+
114125
getSellerData();
115126
getUserSettingsData();
127+
getToggleData();
116128
}, [currentUser]);
117129

118130
// Initialize formData with dbSeller values if available
@@ -579,49 +591,51 @@ const SellerRegistrationForm = () => {
579591
</ToggleCollapse>
580592

581593
{/* Online Shopping */}
582-
<ToggleCollapse
583-
header={t('SCREEN.SELLER_REGISTRATION.SELLER_ONLINE_SHOPPING_LABEL')}
584-
open={false}>
585-
{dbSeller && <OnlineShopping dbSeller={dbSeller} />}
586-
<div>
587-
<Select
588-
label={t(
589-
'SCREEN.SELLER_REGISTRATION.FULFILLMENT_METHOD_TYPE.FULFILLMENT_METHOD_TYPE_LABEL',
590-
)}
591-
name="fulfillment_method"
592-
options={translatedFulfillmentMethod}
593-
value={formData.fulfillment_method}
594-
onChange={handleChange}
595-
/>
596-
<h2 className={SUBHEADER}>
597-
{t('SCREEN.SELLER_REGISTRATION.FULFILLMENT_METHOD_TYPE.FULFILLMENT_METHOD_TYPE_LABEL')}
598-
</h2>
599-
<TextArea
600-
label={t(
601-
'SCREEN.SELLER_REGISTRATION.FULFILLMENT_INSTRUCTIONS_LABEL',
602-
)}
603-
placeholder={t(
604-
'SCREEN.SELLER_REGISTRATION.FULFILLMENT_INSTRUCTIONS_PLACEHOLDER',
605-
)}
606-
name="fulfillment_description"
607-
type="text"
608-
value={formData.fulfillment_description}
609-
onChange={handleChange}
610-
/>
611-
<div className="mb-4 mt-3 ml-auto w-min">
612-
<Button
613-
label={t('SHARED.SAVE')}
614-
disabled={!isSaveEnabled}
615-
styles={{
616-
color: '#ffc153',
617-
height: '40px',
618-
padding: '10px 15px',
619-
}}
620-
onClick={handleSave}
594+
{isOnlineShoppingEnabled && (
595+
<ToggleCollapse
596+
header={t('SCREEN.SELLER_REGISTRATION.SELLER_ONLINE_SHOPPING_LABEL')}
597+
open={false}>
598+
{dbSeller && <OnlineShopping dbSeller={dbSeller} />}
599+
<div>
600+
<Select
601+
label={t(
602+
'SCREEN.SELLER_REGISTRATION.FULFILLMENT_METHOD_TYPE.FULFILLMENT_METHOD_TYPE_LABEL',
603+
)}
604+
name="fulfillment_method"
605+
options={translatedFulfillmentMethod}
606+
value={formData.fulfillment_method}
607+
onChange={handleChange}
608+
/>
609+
<h2 className={SUBHEADER}>
610+
{t('SCREEN.SELLER_REGISTRATION.FULFILLMENT_METHOD_TYPE.FULFILLMENT_METHOD_TYPE_LABEL')}
611+
</h2>
612+
<TextArea
613+
label={t(
614+
'SCREEN.SELLER_REGISTRATION.FULFILLMENT_INSTRUCTIONS_LABEL',
615+
)}
616+
placeholder={t(
617+
'SCREEN.SELLER_REGISTRATION.FULFILLMENT_INSTRUCTIONS_PLACEHOLDER',
618+
)}
619+
name="fulfillment_description"
620+
type="text"
621+
value={formData.fulfillment_description}
622+
onChange={handleChange}
621623
/>
624+
<div className="mb-4 mt-3 ml-auto w-min">
625+
<Button
626+
label={t('SHARED.SAVE')}
627+
disabled={!isSaveEnabled}
628+
styles={{
629+
color: '#ffc153',
630+
height: '40px',
631+
padding: '10px 15px',
632+
}}
633+
onClick={handleSave}
634+
/>
635+
</div>
622636
</div>
623-
</div>
624-
</ToggleCollapse>
637+
</ToggleCollapse>
638+
)}
625639

626640
</div>
627641
<ConfirmDialog

src/app/[locale]/seller/sale-items/[id]/page.tsx

+80-70
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import Skeleton from '@/components/skeleton/skeleton';
1414
import { ISeller, IUserSettings, IUser, SellerItem } from '@/constants/types';
1515
import { fetchSellerItems, fetchSingleSeller } from '@/services/sellerApi';
1616
import { fetchSingleUserSettings } from '@/services/userSettingsApi';
17+
import { fetchToggle } from '@/services/toggleApi';
1718
import { checkAndAutoLoginUser } from '@/utils/auth';
1819

1920
import { AppContext } from '../../../../../../context/AppContextProvider';
@@ -37,9 +38,9 @@ export default function BuyFromSellerForm({ params }: { params: { id: string } }
3738
const [error, setError] = useState<string | null>(null);
3839
const { currentUser, autoLoginUser } = useContext(AppContext);
3940
const [pickedItems, setPickedItems] = useState<{ id: string; quantity: number }[]>([]);
41+
const [isOnlineShoppingEnabled, setOnlineShoppingEnabled] = useState(false);
4042

41-
42-
const observer = useRef<IntersectionObserver | null>(null);
43+
const observer = useRef<IntersectionObserver | null>(null);
4344

4445
const handleShopItemRef = (node: HTMLElement | null) => {
4546
if (node && observer.current) {
@@ -87,30 +88,39 @@ export default function BuyFromSellerForm({ params }: { params: { id: string } }
8788
}
8889
};
8990

91+
const getToggleData = async () => {
92+
try {
93+
const toggle = await fetchToggle('onlineShoppingFeature');
94+
setOnlineShoppingEnabled(toggle.enabled);
95+
} catch (error) {
96+
logger.error('Error fetching toggle:', error);
97+
}
98+
};
99+
90100
getSellerData();
91101
getSellerSettings();
92-
102+
getToggleData();
93103
}, []);
94104

95105
// Fetch seller items
96-
useEffect(() => {
97-
const getSellerItems = async (seller_id: string) => {
98-
try {
99-
const items = await fetchSellerItems(seller_id);
100-
if (items) {
101-
setDbSellerItems(items);
102-
} else {
103-
setDbSellerItems(null);
104-
}
105-
} catch (error) {
106-
logger.error('Error fetching seller items data:', error);
106+
useEffect(() => {
107+
const getSellerItems = async (seller_id: string) => {
108+
try {
109+
const items = await fetchSellerItems(seller_id);
110+
if (items) {
111+
setDbSellerItems(items);
112+
} else {
113+
setDbSellerItems(null);
107114
}
108-
};
109-
110-
if (sellerShopInfo){
111-
getSellerItems(sellerShopInfo.seller_id);
115+
} catch (error) {
116+
logger.error('Error fetching seller items data:', error);
112117
}
113-
}, [sellerShopInfo]);
118+
};
119+
120+
if (sellerShopInfo){
121+
getSellerItems(sellerShopInfo.seller_id);
122+
}
123+
}, [sellerShopInfo]);
114124

115125

116126
const translateSellerCategory = (category: string): string => {
@@ -211,57 +221,57 @@ export default function BuyFromSellerForm({ params }: { params: { id: string } }
211221
</div>
212222

213223
{/* Online Shopping */}
214-
<ToggleCollapse
215-
header={t('SCREEN.SELLER_REGISTRATION.SELLER_ONLINE_SHOPPING_LABEL')}
216-
open={false}>
217-
<div className="max-h-[600px] overflow-y-auto p-1 mb-7 mt-3">
218-
{dbSellerItems && dbSellerItems.length > 0 &&
219-
dbSellerItems.map((item) => (
220-
<ListItem
221-
key={item._id}
222-
item={item}
223-
pickedItems={pickedItems}
224-
setPickedItems={setPickedItems}
225-
refCallback={handleShopItemRef} // Attach observer
226-
/>
227-
))
228-
}
229-
</div>
230-
<div>
231-
<h2 className={SUBHEADER}>{t('SCREEN.SELLER_REGISTRATION.FULFILLMENT_METHOD_TYPE.FULFILLMENT_METHOD_TYPE_LABEL')}</h2>
232-
<Select
233-
name="fulfillment_method"
234-
options={translatedFulfillmentMethod}
235-
value={sellerShopInfo.fulfillment_method}
236-
disabled={true}
237-
/>
238-
<h2 className={SUBHEADER}>{t('SCREEN.SELLER_REGISTRATION.FULFILLMENT_INSTRUCTIONS_LABEL')}</h2>
239-
<TextArea
240-
name="fulfillment_description"
241-
type="text"
242-
value={sellerShopInfo.fulfillment_description}
243-
disabled
244-
/>
245-
<h2 className={SUBHEADER}>{t('Buyer Fulfillment Details')}</h2>
246-
<TextArea
247-
name="buying_details"
248-
type="text"
249-
// value={sellerShopInfo.fulfillment_description}
250-
/>
251-
</div>
252-
<div className="mb-4 mt-3 ml-auto w-min">
253-
<Button
254-
label={t('Checkout')}
255-
disabled={pickedItems.length === 0}
256-
styles={{
257-
color: '#ffc153',
258-
height: '40px',
259-
padding: '15px 20px',
260-
}}
261-
// onClick={handleSave}
262-
/>
263-
</div>
264-
</ToggleCollapse>
224+
{isOnlineShoppingEnabled && (
225+
<ToggleCollapse
226+
header={t('SCREEN.SELLER_REGISTRATION.SELLER_ONLINE_SHOPPING_LABEL')}
227+
open={false}>
228+
<div className="max-h-[600px] overflow-y-auto p-1 mb-7 mt-3">
229+
{dbSellerItems && dbSellerItems.length > 0 &&
230+
dbSellerItems.map((item) => (
231+
<ListItem
232+
key={item._id}
233+
item={item}
234+
pickedItems={pickedItems}
235+
setPickedItems={setPickedItems}
236+
refCallback={handleShopItemRef} // Attach observer
237+
/>
238+
))
239+
}
240+
</div>
241+
<div>
242+
<h2 className={SUBHEADER}>{t('SCREEN.SELLER_REGISTRATION.FULFILLMENT_METHOD_TYPE.FULFILLMENT_METHOD_TYPE_LABEL')}</h2>
243+
<Select
244+
name="fulfillment_method"
245+
options={translatedFulfillmentMethod}
246+
value={sellerShopInfo.fulfillment_method}
247+
disabled={true}
248+
/>
249+
<h2 className={SUBHEADER}>{t('SCREEN.SELLER_REGISTRATION.FULFILLMENT_INSTRUCTIONS_LABEL')}</h2>
250+
<TextArea
251+
name="fulfillment_description"
252+
type="text"
253+
value={sellerShopInfo.fulfillment_description}
254+
disabled
255+
/>
256+
<h2 className={SUBHEADER}>{t('Buyer Fulfillment Details')}</h2>
257+
<TextArea
258+
name="buying_details"
259+
type="text"
260+
/>
261+
</div>
262+
<div className="mb-4 mt-3 ml-auto w-min">
263+
<Button
264+
label={t('Checkout')}
265+
disabled={pickedItems.length === 0}
266+
styles={{
267+
color: '#ffc153',
268+
height: '40px',
269+
padding: '15px 20px',
270+
}}
271+
/>
272+
</div>
273+
</ToggleCollapse>
274+
)}
265275

266276
<ToggleCollapse
267277
header={t('SCREEN.BUY_FROM_SELLER.SELLER_CONTACT_DETAILS_LABEL')}>

src/services/toggleApi.ts

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import axiosClient from "@/config/client";
2+
import logger from '../../logger.config.mjs';
3+
4+
// Fetch a single toggle
5+
export const fetchToggle = async (toggleName: string) => {
6+
try {
7+
logger.info(`Fetching toggle with ID: ${toggleName}`);
8+
const { data } = await axiosClient.get(`/toggles/${toggleName}`);
9+
logger.info(`Fetch toggle successful for ${toggleName}`, { data });
10+
return data;
11+
} catch (error) {
12+
logger.error(`Fetch toggle for ${ toggleName } encountered an error:`, error);
13+
throw new Error('Failed to fetch toggle. Please try again later.');
14+
}
15+
};

0 commit comments

Comments
 (0)