Files
everyone-can-use-english/enjoy/src/renderer/components/audios/audios-segment.tsx
an-lee fbc1394a70 Refactor layout (#1063)
* sidebar collapsable

* resizable panel for audio page

* rename components

* refacotr

* refactor media panels

* refactor

* auto resize waveform

* refactor: rename files

* refactor media components

* refactor

* rename

* fix media provider

* refactor wavefor action buttons

* clean code

* refactor media recording player

* clean up

* fix hotkeys

* refactor

* fix style

* fix style

* fix chat input

* fix shadow player in course

* fix style

* fix style
2024-09-12 06:48:19 +08:00

82 lines
2.3 KiB
TypeScript

import { useState, useEffect, useContext } from "react";
import {
DbProviderContext,
AppSettingsProviderContext,
} from "@renderer/context";
import { Button, ScrollArea, ScrollBar } from "@renderer/components/ui";
import { AudioCard, MediaAddButton } from "@renderer/components";
import { t } from "i18next";
import { Link } from "react-router-dom";
export const AudiosSegment = (props: { limit?: number }) => {
const { limit = 10 } = props;
const [audios, setAudios] = useState<AudioType[]>([]);
const { addDblistener, removeDbListener } = useContext(DbProviderContext);
const { EnjoyApp } = useContext(AppSettingsProviderContext);
useEffect(() => {
fetchResources();
addDblistener(onAudioUpdate);
return () => {
removeDbListener(onAudioUpdate);
};
}, []);
const fetchResources = async () => {
const resources = await EnjoyApp.audios.findAll({
limit,
});
if (!resources) return;
setAudios(resources);
};
const onAudioUpdate = (event: CustomEvent) => {
const { record, action, model } = event.detail || {};
if (model !== "Audio") return;
if (!record) return;
if (action === "create") {
setAudios([record as AudioType, ...audios]);
} else if (action === "destroy") {
setAudios(audios.filter((r) => r.id !== record.id));
}
};
return (
<div>
<div className="flex items-start justify-between mb-4">
<div className="space-y-1">
<h2 className="text-2xl font-semibold tracking-tight capitalize">
{t("addedAudios")}
</h2>
</div>
<div className="ml-auto mr-4">
<Link to="/audios">
<Button variant="link" className="capitalize">
{t("seeMore")}
</Button>
</Link>
</div>
</div>
{audios.length === 0 ? (
<div className="flex items-center justify-center h-48 border border-dashed rounded-lg">
<MediaAddButton />
</div>
) : (
<ScrollArea>
<div className="flex items-center space-x-4 pb-4">
{audios.map((audio) => {
return (
<AudioCard className="w-36" key={audio.id} audio={audio} />
);
})}
</div>
<ScrollBar orientation="horizontal" />
</ScrollArea>
)}
</div>
);
};