support delete record file (#313)

* support delete record file

* fix
This commit is contained in:
Hoan Luu Huu
2023-08-24 06:58:59 +07:00
committed by GitHub
parent 9741e5601f
commit 72de9178a2
3 changed files with 148 additions and 61 deletions
+4
View File
@@ -685,6 +685,10 @@ export const deleteAccountTtsCache = (sid: string) => {
export const deleteClient = (sid: string) => {
return deleteFetch<EmptyResponse>(`${API_CLIENTS}/${sid}`);
};
export const deleteRecord = (url: string) => {
return deleteFetch<EmptyResponse>(url);
};
/** Named wrappers for `getFetch` */
export const getUser = (sid: string) => {
@@ -3,8 +3,8 @@ import React from "react";
import WaveSurfer from "wavesurfer.js";
import { useEffect, useRef, useState } from "react";
import { Icon, P } from "@jambonz/ui-kit";
import { Icons, ModalClose } from "src/components";
import { getBlob, getJaegerTrace } from "src/api";
import { Icons, Modal, ModalClose } from "src/components";
import { deleteRecord, getBlob, getJaegerTrace } from "src/api";
import { DownloadedBlob, RecentCall } from "src/api/types";
import RegionsPlugin, { Region } from "wavesurfer.js/src/plugin/regions";
import TimelinePlugin from "wavesurfer.js/src/plugin/timeline";
@@ -21,6 +21,7 @@ import {
getSpansByNameRegex,
getSpansFromJaegerRoot,
} from "./utils";
import { toastError, toastSuccess } from "src/store";
type PlayerProps = {
call: RecentCall;
@@ -49,6 +50,8 @@ export const Player = ({ call }: PlayerProps) => {
const [record, setRecord] = useState<DownloadedBlob | null>(null);
const [deleteRecordUrl, setDeleteRecordUrl] = useState("");
const drawDtmfRegionForSpan = (s: JaegerSpan, startPoint: JaegerSpan) => {
if (waveSufferRef.current) {
const r = waveSufferRef.current.regions.list[s.spanId];
@@ -201,6 +204,19 @@ export const Player = ({ call }: PlayerProps) => {
}
};
const handleDeleteRecordSubmit = () => {
if (deleteRecordUrl) {
deleteRecord(deleteRecordUrl)
.then(() => {
setDeleteRecordUrl("");
toastSuccess("Successfully deleted record");
})
.catch((error) => {
toastError(error.msg);
});
}
};
useEffect(() => {
buildWavesufferRegion();
}, [jaegerRoot, isReady]);
@@ -314,53 +330,71 @@ export const Player = ({ call }: PlayerProps) => {
<div className="media-container__center">
<strong>{playBackTime}</strong>
</div>
<div className="media-container__center">
<button
className="btnty"
type="button"
onClick={() => {
setPlaybackJump(-JUMP_DURATION);
}}
title="Jump left"
disabled={!isReady}
>
<Icon>
<Icons.ChevronsLeft />
</Icon>
</button>
<button
className="btnty"
type="button"
onClick={togglePlayback}
title="play/pause"
disabled={!isReady}
>
<Icon>{isPlaying ? <Icons.Pause /> : <Icons.Play />}</Icon>
</button>
<div className="controll-btn-container">
<div className="controll-btn-container__placeholder"></div>
<div className="controll-btn-container__center">
<button
className="btnty"
type="button"
onClick={() => {
setPlaybackJump(-JUMP_DURATION);
}}
title="Jump left"
disabled={!isReady}
>
<Icon>
<Icons.ChevronsLeft />
</Icon>
</button>
<button
className="btnty"
type="button"
onClick={togglePlayback}
title="play/pause"
disabled={!isReady}
>
<Icon>{isPlaying ? <Icons.Pause /> : <Icons.Play />}</Icon>
</button>
<button
className="btnty"
type="button"
onClick={() => {
setPlaybackJump(JUMP_DURATION);
}}
title="Jump right"
disabled={!isReady}
>
<Icon>
<Icons.ChevronsRight />
</Icon>
</button>
<a
href={record.data_url}
download={record.file_name}
className="btnty"
title="Download record file"
>
<Icon>
<Icons.Download />
</Icon>
</a>
<button
className="btnty"
type="button"
onClick={() => {
setPlaybackJump(JUMP_DURATION);
}}
title="Jump right"
disabled={!isReady}
>
<Icon>
<Icons.ChevronsRight />
</Icon>
</button>
</div>
<div className="controll-btn-container__right">
<a
href={record.data_url}
download={record.file_name}
className="btnty"
title="Download record file"
>
<Icon>
<Icons.Download />
</Icon>
</a>
<button
type="button"
onClick={() => {
setDeleteRecordUrl(url || "");
}}
title="Delete record file"
>
<Icon>
<Icons.Trash2 />
</Icon>
</button>
</div>
</div>
<label htmlFor="is_active" className="chk">
<input
@@ -464,6 +498,17 @@ export const Player = ({ call }: PlayerProps) => {
</div>
</ModalClose>
)}
{deleteRecordUrl && (
<Modal
handleCancel={() => setDeleteRecordUrl("")}
handleSubmit={handleDeleteRecordSubmit}
>
<P>
Are you sure you want to delete the record for call{" "}
<strong>{call_sid}</strong>?
</P>
</Modal>
)}
</>
);
};
@@ -19,6 +19,57 @@
}
}
.controll-btn-container {
display: flex;
justify-content: space-between;
position: relative;
padding: 13px;
&__center {
position: absolute;
left: 50%;
transform: translateX(-50%);
button:not(:last-child) {
margin-right: ui-vars.$px01;
}
button {
background-color: transparent;
width: auto;
height: auto;
border: 0;
padding: 0;
}
.ico {
color: ui-vars.$white;
@include mixins.icosize();
}
}
&__right {
a:not(:last-child) {
margin-right: ui-vars.$px01;
}
button {
background-color: transparent;
width: auto;
height: auto;
border: 0;
padding: 0;
}
.ico {
color: ui-vars.$white;
@include mixins.icosize();
}
}
&__placeholder {
flex: 1;
}
}
.media-container {
border: 1px solid black;
border-radius: ui-vars.$px01;
@@ -31,18 +82,5 @@
justify-content: center;
grid-gap: ui-vars.$px01;
margin-top: ui-vars.$px01;
button {
background-color: transparent;
width: auto;
height: auto;
border: 0;
padding: 0;
}
.ico {
color: ui-vars.$white;
@include mixins.icosize();
}
}
}