Skip to content

Commit

Permalink
Merge branch '2-port-service-workers'
Browse files Browse the repository at this point in the history
  • Loading branch information
obender committed Oct 14, 2024
2 parents 1f05a0c + 93f654c commit 1bc39ee
Show file tree
Hide file tree
Showing 15 changed files with 352 additions and 302 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,22 +4,26 @@ import DialogActions from "@mui/material/DialogActions";
import DialogContent from "@mui/material/DialogContent";
import React, { useEffect, useState } from "react";
import { browserWindow, querySelector } from "../../../../../../utils/dom/html";
import { ALI_SUPER_DEALS_GLUE } from "../../../../../../utils/extension/glue";
import { SiteMetadata } from "../../../../../../utils/site/site-information";
import { ISuperDealProduct } from "../../../common/interfaces";
import { isAliexpressCampaignPage } from "../../utils/ali-super-deals-utils-ui";
import AliSuperDealsDatatable from "../datatable/datatable";
import AliSuperDealsDialogContentHeader from "../dialog/dialog-header";
import Transition from "../dialog/dialog-transition";
import AliSuperDealsAppBar from "../toolbar/toolbar";
import { SiteUtil } from "../../../../../engine/logic/utils/site-utils";
import { ProductStore } from "../../../../../engine/logic/conclusion/conclusion-product-entity.interface";
import { useAliexpressDealsStore, aliexpressDealsStoreReady } from "@store/AliexpressDealsState";
import { definePegasusMessageBus } from "@utils/pegasus/transport";
import {
AliSuperDealsMessageType,
IAliSuperDealsBus
} from "@e-commerce/apps/deals-ali-express/worker/ali-super-deals-worker";

function SuperDealsAnalyzer(): JSX.Element {
const [open, setOpen] = useState(false);
const [superDeals, setSuperDeals] = useState<ISuperDealProduct[]>([]);
const [loadingSuperDeals, setLoadingSuperDeals] = useState(false);
const { superDeals, loading } = useAliexpressDealsStore();
const [loadingReloadMoreDeals, setLoadingReloadMoreDeals] = useState(false);
const { sendMessage } = definePegasusMessageBus<IAliSuperDealsBus>();
const store = SiteUtil.getStore();
const isItemDetail = SiteUtil.isItemDetails();
const isWholesale = SiteUtil.isWholesale();
Expand All @@ -46,18 +50,11 @@ function SuperDealsAnalyzer(): JSX.Element {
setTimeout(myAutoScroll, 1000);
}
if (count === 0) {
setLoadingSuperDeals(false);
setLoadingReloadMoreDeals(false);

ALI_SUPER_DEALS_GLUE.send({
const data = {
pageDocument: SiteMetadata.getDomOuterHTML(browserWindow().document)
});

ALI_SUPER_DEALS_GLUE.client((response: any) => {
const { result } = response;
const { deals }: { deals: ISuperDealProduct[] } = result;
setSuperDeals(deals);
});
};
sendMessage(AliSuperDealsMessageType.FETCH_ALI_SUPER_DEALS, data);
}
}
setTimeout(myAutoScroll, 1000);
Expand All @@ -74,14 +71,14 @@ function SuperDealsAnalyzer(): JSX.Element {
}

setOpen(true);
setLoadingSuperDeals(true);
reloadMoreDealsMechanism();
};

const handleClose = (): void => setOpen(false);
const handleReloadMoreDeals = (): void => reloadMoreDealsMechanism();

useEffect(() => {
aliexpressDealsStoreReady();
if (isAliexpressCampaignPage()) {
handleClickOpen();
}
Expand Down Expand Up @@ -115,7 +112,7 @@ function SuperDealsAnalyzer(): JSX.Element {
superDeals={superDeals}
/>
<div id="alert-dialog-slide-description">
<AliSuperDealsDatatable deals={superDeals} loading={loadingSuperDeals} />
<AliSuperDealsDatatable deals={superDeals} loading={loading} />
</div>
</DialogContent>
<DialogActions className="sd-ae-deals__dialog__actions" />
Expand Down
Original file line number Diff line number Diff line change
@@ -1,18 +1,36 @@
import { parseAsHtml } from "../../../../utils/dom/html";
import { ALI_SUPER_DEALS_GLUE } from "../../../../utils/extension/glue";
import { logError, debug } from "@utils/analytics/logger";
import { definePegasusMessageBus } from "@utils/pegasus/transport";
import { initAliexpressDealsStoreBackend } from "@store/AliexpressDealsState";
import { parseAsHtml } from "@utils/dom/html";
import { AliSuperDealsMessageRequest, ISuperDealProduct } from "../common/interfaces";
import { getAliExpressSuperDeals } from "./ali-super-deals-analyzer";

export const initAliExpressSuperDealsWorker = (): void => {
// listen to ali super deals request from content script
ALI_SUPER_DEALS_GLUE.worker(async (message: AliSuperDealsMessageRequest, sendResponse) => {
const { pageDocument } = message;
const currentPageDom: Document | any = parseAsHtml(pageDocument);
const aliSuperDeals: ISuperDealProduct[] = getAliExpressSuperDeals({
dom: currentPageDom
});
export enum AliSuperDealsMessageType {
FETCH_ALI_SUPER_DEALS = "fetchAliSuperDeals"
}
export interface IAliSuperDealsBus {
[AliSuperDealsMessageType.FETCH_ALI_SUPER_DEALS]: (request: AliSuperDealsMessageRequest) => Promise<void>;
}

// send back the ali super deals to the content script
sendResponse({ result: { deals: aliSuperDeals } });
export const initAliExpressSuperDealsWorker = async (): Promise<void> => {
const store = await initAliexpressDealsStoreBackend();
debug("AliexpressDealsStore:: AliexpressDealsStore ready:", store);
const { onMessage } = definePegasusMessageBus<IAliSuperDealsBus>();

onMessage(AliSuperDealsMessageType.FETCH_ALI_SUPER_DEALS, async (request) => {
store.getState().setLoading(true);
try {
const { pageDocument } = request.data;
const currentPageDom: Document | any = parseAsHtml(pageDocument);
const deals: ISuperDealProduct[] = getAliExpressSuperDeals({
dom: currentPageDom
});
store.getState().setSuperDeals(deals);
} catch (error) {
logError(error);
store.getState().setSuperDeals([]);
} finally {
store.getState().setLoading(false);
}
});
};
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,11 @@ export enum AmazonCouponsMessageType {
FETCH_AMAZON_COUPONS = "fetchAmazonCoupons"
}
export interface IAmazonCouponsDealsBus {
fetchAmazonCoupons: (request: { document: string; url: string; domainUrl: string }) => Promise<{
deals: any[];
}>;
[AmazonCouponsMessageType.FETCH_AMAZON_COUPONS]: (request: {
document: string;
url: string;
domainUrl: string;
}) => Promise<void>;
}

export const initAmazonCouponsWorker = async (): Promise<void> => {
Expand All @@ -24,19 +26,16 @@ export const initAmazonCouponsWorker = async (): Promise<void> => {
const { document, url, domainUrl } = request.data;
if (!AmazonSiteUtils.isAmazonWholesale(url)) {
store.getState().setCoupons([]);
return { deals: [] };
}
store.getState().setLoading(true);
const currentPageDom: ParsedHtml = parseAsHtml(document);
try {
const deals = await getAllAmazonCoupons({ url, domainUrl, currentPageDom });
store.getState().setCoupons(deals);
store.getState().setLoading(false);
return { deals };
} catch (error) {
logError(error);
} finally {
store.getState().setLoading(false);
return { deals: [] };
}
});
} catch (error) {
Expand Down
28 changes: 8 additions & 20 deletions src/e-commerce/apps/deals-amazon/ui/DealsCouponsApp.tsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
import ThemeProvider from "@mui/material/styles/ThemeProvider";
import { debug, logError } from "@utils/analytics/logger";
import React, { useEffect } from "react";
import { definePegasusMessageBus } from "@utils/pegasus/transport";
import { useAmazonCouponsStore } from "@store/AmazonCouponsState";
import { useAmazonCouponsStore, amazonCouponsStoreReady } from "@store/AmazonCouponsState";
import { ErrorBoundary } from "../../../../utils/analytics/ErrorBoundary";
import { browserWindow } from "../../../../utils/dom/html";
import { SafeDealTheme } from "../../../../utils/react/theme";
Expand All @@ -12,28 +11,17 @@ import { IAmazonCouponsDealsBus, AmazonCouponsMessageType } from "../background/

export function SdDealsCouponsApp(): JSX.Element {
const { coupons, loading, setCoupons, setLoading } = useAmazonCouponsStore();

const { sendMessage } = definePegasusMessageBus<IAmazonCouponsDealsBus>();

useEffect(() => {
const fetchCoupons = async () => {
setLoading(true);
const data = {
document: SiteMetadata.getDomOuterHTML(browserWindow().document),
url: SiteMetadata.getURL(),
domainUrl: SiteMetadata.getDomainURL()
};
try {
const response = await sendMessage(AmazonCouponsMessageType.FETCH_AMAZON_COUPONS, data);
setCoupons(response.deals);
} catch (error) {
logError(error, "::Error fetching Amazon coupons!");
setCoupons([]);
} finally {
setLoading(false);
}
amazonCouponsStoreReady();
const data = {
document: SiteMetadata.getDomOuterHTML(browserWindow().document),
url: SiteMetadata.getURL(),
domainUrl: SiteMetadata.getDomainURL()
};

fetchCoupons();
sendMessage(AmazonCouponsMessageType.FETCH_AMAZON_COUPONS, data);
}, [setCoupons, setLoading]);

return (
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,16 @@
import React, { useCallback, useEffect, useMemo } from "react";
import { t } from "../../../../../../constants/messages";
import { logError } from "../../../../../../utils/analytics/logger";
import { browserWindow } from "../../../../../../utils/dom/html";
import { REVIEW_SUMMARY_GLUE } from "../../../../../../utils/extension/glue";
import { SiteMetadata } from "../../../../../../utils/site/site-information";
import React, { useEffect, useMemo } from "react";
import { t } from "@constants/messages";
import { browserWindow } from "@utils/dom/html";
import { SiteMetadata } from "@utils/site/site-information";
import { ProductStore } from "../../../../../engine/logic/conclusion/conclusion-product-entity.interface";
import { createReviewsSummary } from "../../../../../reviews/reviews-utils";
import { LoaderSpinner } from "../../../shared/Loader";
import { ReviewsDetails } from "./ReviewsDetails";
import { ReviewsImages } from "./ReviewsImages";
import { ReviewsImagesBigGallery } from "./ReviewsImagesBigGallery";
import { useReviewSummaryStore, reviewSummaryStoreReady } from "@store/ReviewSummaryState";
import { definePegasusMessageBus } from "@utils/pegasus/transport";
import { IReviewSummaryMessageBus, ReviewSummaryMessageType } from "@e-commerce/reviews/reviews-worker";

interface IReviewsProps {
productId: string;
Expand All @@ -20,48 +21,37 @@ interface IReviewsProps {
}

export const Reviews = ({ productId, store, isGalleryOnly = false, isSupplier, storeFeedbackUrl }: IReviewsProps) => {
const [isLoaded, setIsLoaded] = React.useState(false);
const [isRequested, setIsRequested] = React.useState(false);
const { reviewData, isLoading, error } = useReviewSummaryStore();
const { sendMessage } = definePegasusMessageBus<IReviewSummaryMessageBus>();

const [reviews, setReviews] = React.useState([]);
const [gallery, setGallery] = React.useState([]);
const [error, setError] = React.useState(null);
const [totalReviews, setTotalReviews] = React.useState<string | null>(null);
const [rating, setRating] = React.useState<string | null>(null);

const handleReviewsSummary = useCallback((result) => {
setIsLoaded(true);

if (result?.error) {
logError(new Error(result?.error), "Reviews Summarization Error");
setError(result.error);
}

const reviewsSummary = createReviewsSummary(result?.reviewsSummary);
setGallery(result?.reviewsImages);
setReviews(reviewsSummary);
setTotalReviews(result.totalReviews);
setRating(result?.rating);
useEffect(() => {
reviewSummaryStoreReady();
}, []);

const requestReviewsSummary = useCallback(() => {
if (isRequested) {
return;
}
REVIEW_SUMMARY_GLUE.send({
useEffect(() => {
sendMessage(ReviewSummaryMessageType.GENERATE_REVIEW_SUMMARY, {
productId,
document: SiteMetadata.getDomOuterHTML(browserWindow().document),
siteUrl: SiteMetadata.getURL(),
store,
isSupplier,
storeFeedbackUrl
});
setIsRequested(true);
}, [isRequested, productId, store]);
}, [productId, store]);

useEffect(() => {
REVIEW_SUMMARY_GLUE.client(handleReviewsSummary);
requestReviewsSummary();
}, [handleReviewsSummary, requestReviewsSummary]);
if (!reviewData) return;
const reviewsSummary = createReviewsSummary(reviewData?.reviewsSummary);
setGallery(reviewData?.reviewsImages);
setReviews(reviewsSummary);
setTotalReviews(reviewData?.totalReviews?.toString());
setRating(reviewData?.rating?.toString());
}, [reviewData]);

const memoizedReviews = useMemo(
() =>
Expand All @@ -83,7 +73,7 @@ export const Reviews = ({ productId, store, isGalleryOnly = false, isSupplier, s
[reviews]
);

if (!isLoaded) {
if (isLoading) {
return <LoaderSpinner />;
}

Expand Down
Loading

0 comments on commit 1bc39ee

Please sign in to comment.