добавление utm меток
This commit is contained in:
parent
65db81af2d
commit
14bfc6750f
@ -10,9 +10,10 @@ interface AuditoryLinkProps {
|
|||||||
item: AuditoryItem;
|
item: AuditoryItem;
|
||||||
index: number;
|
index: number;
|
||||||
onDelete: (id: number) => void;
|
onDelete: (id: number) => void;
|
||||||
|
utmParams:string
|
||||||
}
|
}
|
||||||
|
|
||||||
export const AuditoryLink = ({ item, index, onDelete }: AuditoryLinkProps) => {
|
export const AuditoryLink = ({ utmParams, item, index, onDelete }: AuditoryLinkProps) => {
|
||||||
const theme = useTheme();
|
const theme = useTheme();
|
||||||
const { isTestServer } = useDomainDefine();
|
const { isTestServer } = useDomainDefine();
|
||||||
|
|
||||||
@ -24,7 +25,7 @@ export const AuditoryLink = ({ item, index, onDelete }: AuditoryLinkProps) => {
|
|||||||
onDelete(item.id);
|
onDelete(item.id);
|
||||||
};
|
};
|
||||||
|
|
||||||
const linkText = `${isTestServer ? "https://s.hbpn.link/" : "https://hbpn.link/"}?_paud=${item.id}`;
|
const linkText = `${isTestServer ? "https://s.hbpn.link/" : "https://hbpn.link/"}?_paud=${item.id}${utmParams}`;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<ListItem
|
<ListItem
|
||||||
|
@ -6,7 +6,7 @@ import { Box, Collapse, IconButton, List, Typography, useTheme } from "@mui/mate
|
|||||||
import { useEffect, useState } from "react";
|
import { useEffect, useState } from "react";
|
||||||
import { AuditoryLink } from "./AuditoryLink";
|
import { AuditoryLink } from "./AuditoryLink";
|
||||||
|
|
||||||
export const AuditoryList = ({auditory, onDelete}:{auditory:AuditoryItem[], onDelete: (id: number) => void}) => {
|
export const AuditoryList = ({utmParams, auditory, onDelete}:{utmParams:string,auditory:AuditoryItem[], onDelete: (id: number) => void}) => {
|
||||||
const theme = useTheme();
|
const theme = useTheme();
|
||||||
const { isTestServer } = useDomainDefine();
|
const { isTestServer } = useDomainDefine();
|
||||||
const [linksOpen, setLinksOpen] = useState(true);
|
const [linksOpen, setLinksOpen] = useState(true);
|
||||||
@ -39,7 +39,7 @@ export const AuditoryList = ({auditory, onDelete}:{auditory:AuditoryItem[], onDe
|
|||||||
<Collapse in={linksOpen} timeout="auto" unmountOnExit sx={{ mt: "3px" }}>
|
<Collapse in={linksOpen} timeout="auto" unmountOnExit sx={{ mt: "3px" }}>
|
||||||
<List sx={{ gap: '8px', p: 0, m: 0 }}>
|
<List sx={{ gap: '8px', p: 0, m: 0 }}>
|
||||||
{auditory.map((item, idx) => (
|
{auditory.map((item, idx) => (
|
||||||
<AuditoryLink key={idx} item={item} index={idx} onDelete={onDelete} />
|
<AuditoryLink utmParams={utmParams} key={idx} item={item} index={idx} onDelete={onDelete} />
|
||||||
))}
|
))}
|
||||||
</List>
|
</List>
|
||||||
</Collapse>
|
</Collapse>
|
||||||
|
@ -14,6 +14,8 @@ export default function PersonalizationAI() {
|
|||||||
const theme = useTheme();
|
const theme = useTheme();
|
||||||
const [auditory, setAuditory] = useState<AuditoryItem[]>([]);
|
const [auditory, setAuditory] = useState<AuditoryItem[]>([]);
|
||||||
const [deleteModal, setDeleteModal] = useState<number>(0);
|
const [deleteModal, setDeleteModal] = useState<number>(0);
|
||||||
|
const [link, setLink] = useState<string>('');
|
||||||
|
const [utmParams, setUtmParams] = useState<string>('');
|
||||||
const quiz = useCurrentQuiz();
|
const quiz = useCurrentQuiz();
|
||||||
const { enqueueSnackbar } = useSnackbar();
|
const { enqueueSnackbar } = useSnackbar();
|
||||||
|
|
||||||
@ -75,6 +77,30 @@ export default function PersonalizationAI() {
|
|||||||
setAuditory(old => ([...old, item]))
|
setAuditory(old => ([...old, item]))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const handleLinkChange = (e: React.ChangeEvent<HTMLInputElement>) => {
|
||||||
|
const newLink = e.target.value;
|
||||||
|
setLink(newLink);
|
||||||
|
|
||||||
|
// Регулярное выражение для поиска параметров URL
|
||||||
|
const paramRegex = /[?&]([^=&]+)=([^&]*)/g;
|
||||||
|
const params: Record<string, string> = {};
|
||||||
|
let match;
|
||||||
|
|
||||||
|
// Ищем все параметры в строке
|
||||||
|
while ((match = paramRegex.exec(newLink)) !== null) {
|
||||||
|
const key = decodeURIComponent(match[1]);
|
||||||
|
const value = decodeURIComponent(match[2]);
|
||||||
|
params[key] = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Преобразуем объект параметров в строку URL
|
||||||
|
const paramString = Object.entries(params)
|
||||||
|
.map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(value)}`)
|
||||||
|
.join('&');
|
||||||
|
|
||||||
|
setUtmParams(paramString);
|
||||||
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<Container id="PersonalizationAI" maxWidth={false} sx={{ minHeight: "100%", p: "20px", height: " calc(100vh - 80px)", overflow: "auto", pt: "55px"}}>
|
<Container id="PersonalizationAI" maxWidth={false} sx={{ minHeight: "100%", p: "20px", height: " calc(100vh - 80px)", overflow: "auto", pt: "55px"}}>
|
||||||
@ -121,16 +147,17 @@ export default function PersonalizationAI() {
|
|||||||
</Typography>
|
</Typography>
|
||||||
<CustomTextField
|
<CustomTextField
|
||||||
placeholder="linkexample.com"
|
placeholder="linkexample.com"
|
||||||
maxLength={5}
|
maxLength={500}
|
||||||
|
value={link}
|
||||||
|
onChange={handleLinkChange}
|
||||||
sxForm={{
|
sxForm={{
|
||||||
width: "615px",
|
width: "615px",
|
||||||
}}
|
}}
|
||||||
|
|
||||||
/>
|
/>
|
||||||
</Box>
|
</Box>
|
||||||
</Box>
|
</Box>
|
||||||
|
|
||||||
<AuditoryList onDelete={setDeleteModal} auditory={auditory} />
|
<AuditoryList utmParams={utmParams} onDelete={setDeleteModal} auditory={auditory} />
|
||||||
|
|
||||||
</Container>
|
</Container>
|
||||||
<Modal
|
<Modal
|
||||||
|
Loading…
Reference in New Issue
Block a user