import React, { useCallback, useState } from "react";
import Dialog from "@material-ui/core/Dialog";
import DialogContent from "@material-ui/core/DialogContent";
import MuiDialogTitle from "@material-ui/core/DialogTitle";
import {
Box,
createMuiTheme,
IconButton,
Link,
Theme,
Typography,
withStyles,
} from "@material-ui/core";
import CloseIcon from "@material-ui/icons/Close";
import { ListCountriesProvincesCities } from "./ListCountriesProvincesCities";
import { makeStyles, ThemeProvider } from "@material-ui/core/styles";
import { ListCities } from "./ListCities";
import {
COOKIE_DISABLE_POPUP,
COOKIE_LOCATION_ID,
COOKIE_LOCATION_TYPE,
LIST_MODE_CITIES,
LIST_MODE_COUNTRIES,
LIST_MODE_COUNTRIES_CITIES,
LIST_MODE_COUNTRIES_PROVINCES_CITIES,
LIST_MODE_PROVINCES_CITIES,
LOCATION_TYPE_CITY,
LOCATION_TYPE_COUNTRY,
LOCATION_TYPE_PROVINCE,
SEO_MODE_COOKIE,
SEO_MODE_SUBDOMAIN,
SEO_MODE_SUBFOLDER,
} from "./types/constants";
import _ from "lodash";
import { McsOptions } from "./types/options";
import { McsData, McsLocation, McsLocationType } from "./types/data";
import { useCookies } from "react-cookie";
import { ClassNameMap } from "@material-ui/styles/withStyles/withStyles";
import { McsPopup } from "./McsPopup";
import { ListProvincesCities } from "./ListProvincesCities";
import { ListCountriesCities } from "./ListCountriesCities";
import { ListCountries } from "./ListCountries";
export type handleLocationSelectFn = (location: McsLocation) => void;
export type handleLocationAndTypeSelectFn = (
location: McsLocation,
mcsLocationConstType: McsLocationType
) => void;
export const McsTheme = createMuiTheme({
typography: {
htmlFontSize: 10,
},
});
const styles = (theme: Theme) => ({
root: {
margin: 0,
padding: theme.spacing(2),
},
closeButton: {
position: "absolute" as const,
right: theme.spacing(1),
top: theme.spacing(1),
color: theme.palette.grey[500],
},
});
export const DialogTitle = withStyles(styles)(
({
children,
classes,
onClose,
...other
}: {
children: React.Component | string;
classes: ClassNameMap;
onClose: () => void;
}) => {
return (
{children}
{onClose ? (
) : null}
);
}
);
const useStyles = makeStyles(() => ({
root: {
overflowY: "visible",
},
paper: {
overflowY: "visible",
},
}));
interface McsWidgetProps {
options: McsOptions;
data: McsData;
}
export const McsWidget: React.FC = ({
options,
data,
}: McsWidgetProps) => {
console.log("options", options);
console.log("data", data);
const [locationTypeCookie, setLocationTypeCookie] = useCookies<
typeof COOKIE_LOCATION_TYPE
>([COOKIE_LOCATION_TYPE]);
const [locationIdCookie, setLocationIdCookie] = useCookies<
typeof COOKIE_LOCATION_ID
>([COOKIE_LOCATION_ID]);
const [cookieDisablePopup, setCookieDisablePopup] = useCookies<
typeof COOKIE_DISABLE_POPUP
>([COOKIE_DISABLE_POPUP]);
const cookieLocationType: McsLocationType | undefined = _.get(
locationTypeCookie,
COOKIE_LOCATION_TYPE
);
const cookieLocationId: number | undefined = _.get(
locationIdCookie,
COOKIE_LOCATION_ID
);
const [open, setOpen] = useState(false);
const [showPopup, setShowPopup] = useState(
_.get(cookieDisablePopup, COOKIE_DISABLE_POPUP) != "1"
);
// console.log("locationType", locationType);
// console.log("locationId", locationId);
// console.log(
// "_.get(cookieDisablePopup, COOKIE_DISABLE_POPUP)",
// _.get(cookieDisablePopup, COOKIE_DISABLE_POPUP)
// );
// console.log("showPopup", showPopup);
const [selectedCityId, setSelectedCityId] = useState();
const linkRef = React.useRef();
let defaultLocation: McsLocation =
data.countries[Object.keys(data.countries)[0]];
let defaultLocationType: McsLocationType = LOCATION_TYPE_COUNTRY;
if (options.default_location_id && options.default_location_type) {
switch (options.default_location_type) {
case LOCATION_TYPE_CITY:
defaultLocation = data.cities[options.default_location_id];
defaultLocationType = LOCATION_TYPE_CITY;
break;
case LOCATION_TYPE_PROVINCE:
defaultLocation = data.provinces[options.default_location_id];
defaultLocationType = LOCATION_TYPE_PROVINCE;
break;
case LOCATION_TYPE_COUNTRY:
defaultLocation = data.countries[options.default_location_id];
defaultLocationType = LOCATION_TYPE_COUNTRY;
break;
}
}
const handleClose = () => {
setOpen(false);
};
const handleShowDialog: () => void = () => {
setShowPopup(false);
setOpen(true);
setCookieDisablePopup(COOKIE_DISABLE_POPUP, "1", {
domain: `.${options.base_domain}`,
});
};
const handleLinkClick = (e) => {
if (e) {
e.preventDefault();
}
handleShowDialog();
};
const handleLocationSelectCookieMode: handleLocationAndTypeSelectFn =
useCallback(
(mcsLocation, mcsLocationConstType) => {
if (
cookieLocationType != mcsLocationConstType ||
cookieLocationId != mcsLocation.id
) {
setLocationTypeCookie(
COOKIE_LOCATION_TYPE,
mcsLocationConstType
);
setLocationIdCookie(COOKIE_LOCATION_ID, mcsLocation.id);
location.reload();
}
},
[
cookieLocationId,
cookieLocationType,
setLocationIdCookie,
setLocationTypeCookie,
]
);
const handleLocationSelectSubdomainMode: handleLocationAndTypeSelectFn =
useCallback(
(mcsLocation, mcsLocationConstType) => {
if (
cookieLocationType != mcsLocationConstType ||
cookieLocationId != mcsLocation.id
) {
setLocationTypeCookie(
COOKIE_LOCATION_TYPE,
mcsLocationConstType,
{
domain: `.${options.base_domain}`,
}
);
setLocationIdCookie(COOKIE_LOCATION_ID, mcsLocation.id, {
domain: `.${options.base_domain}`,
});
}
if (
data.current_location_id != mcsLocation.id ||
data.current_location_type != mcsLocationConstType
) {
const url = new URL(window.location.href);
let newHost;
if (
mcsLocationConstType == defaultLocationType &&
mcsLocation.id == defaultLocation.id
) {
newHost = options.base_domain;
} else {
newHost = `${mcsLocation.subdomain}.${options.base_domain}`;
}
if (url.hostname != newHost) {
url.hostname = newHost;
location.replace(url.href);
}
}
},
[
cookieLocationType,
cookieLocationId,
setLocationTypeCookie,
options.base_domain,
setLocationIdCookie,
data.current_location_id,
data.current_location_type,
defaultLocationType,
defaultLocation.id,
]
);
const handleLocationSelectSubFolderMode: handleLocationAndTypeSelectFn =
useCallback(
(mcsLocation, mcsLocationConstType) => {
// console.log("mcsLocation", mcsLocation);
// console.log("mcsLocationConstType", mcsLocationConstType);
if (
cookieLocationType != mcsLocationConstType ||
cookieLocationId != mcsLocation.id
) {
setLocationTypeCookie(
COOKIE_LOCATION_TYPE,
mcsLocationConstType,
{
domain: `.${options.base_domain}`,
}
);
setLocationIdCookie(COOKIE_LOCATION_ID, mcsLocation.id, {
domain: `.${options.base_domain}`,
});
}
if (
data.current_location_id != mcsLocation.id ||
data.current_location_type != mcsLocationConstType
) {
const url = new URL(window.location.href);
if (
data.current_location_id == defaultLocation.id &&
data.current_location_type == defaultLocationType
) {
// console.log("replace default");
url.pathname =
`/${mcsLocation.subdomain}` + url.pathname;
} else {
// console.log("replace custom");
// console.log(url.pathname);
if (
mcsLocation.id == defaultLocation.id &&
mcsLocationConstType == defaultLocationType
) {
url.pathname = url.pathname.replace(/\/[^/?]+/, "");
} else {
url.pathname = url.pathname.replace(
/\/[^/?]+/,
`/${mcsLocation.subdomain}`
);
}
}
// console.log(url.pathname);
location.replace(url.href);
}
},
[
cookieLocationType,
cookieLocationId,
setLocationTypeCookie,
options.base_domain,
setLocationIdCookie,
data.current_location_id,
data.current_location_type,
defaultLocationType,
defaultLocation.id,
]
);
const handleLocationSelect: handleLocationAndTypeSelectFn = useCallback(
(mcsLocation, mcsLocationType) => {
switch (options.seo_mode) {
case SEO_MODE_COOKIE:
handleLocationSelectCookieMode(
mcsLocation,
mcsLocationType
);
break;
case SEO_MODE_SUBDOMAIN:
handleLocationSelectSubdomainMode(
mcsLocation,
mcsLocationType
);
break;
case SEO_MODE_SUBFOLDER:
handleLocationSelectSubFolderMode(
mcsLocation,
mcsLocationType
);
break;
}
if (mcsLocationType == LOCATION_TYPE_CITY) {
setSelectedCityId(mcsLocation?.id);
}
setCookieDisablePopup(COOKIE_DISABLE_POPUP, "1", {
domain: `.${options.base_domain}`,
});
setOpen(false);
setShowPopup(false);
},
[
handleLocationSelectCookieMode,
handleLocationSelectSubFolderMode,
handleLocationSelectSubdomainMode,
options.base_domain,
options.seo_mode,
setCookieDisablePopup,
]
);
const handleCitySelect: handleLocationSelectFn = useCallback(
(mcsLocation) => {
handleLocationSelect(mcsLocation, LOCATION_TYPE_CITY);
},
[handleLocationSelect]
);
const handleCountrySelect: handleLocationSelectFn = useCallback(
(mcsLocation) => {
handleLocationSelect(mcsLocation, LOCATION_TYPE_COUNTRY);
},
[handleLocationSelect]
);
const classes = useStyles();
if (_.isEmpty(data.cities)) {
return null;
}
const getCurrentLocation = () => {
switch (data.current_location_type) {
case LOCATION_TYPE_CITY:
return data.cities[data.current_location_id];
case LOCATION_TYPE_PROVINCE:
return data.provinces[data.current_location_id];
case LOCATION_TYPE_COUNTRY:
return data.countries[data.current_location_id];
default:
return options.default_location_id
? data.cities[options.default_location_id]
: null;
}
};
const currentLocation = getCurrentLocation();
return (
{currentLocation
? `Location: ${currentLocation.title}`
: "Choose location"}
setShowPopup(false)}
title={defaultLocation.title}
handleLocationSelect={() =>
handleLocationSelect(
defaultLocation,
defaultLocationType
)
}
handleClose={handleShowDialog}
//@ts-ignore
anchorEl={() => linkRef.current}
/>
);
};