mirror of
https://github.com/Monadical-SAS/reflector.git
synced 2025-12-20 12:19:06 +00:00
150 lines
5.8 KiB
TypeScript
150 lines
5.8 KiB
TypeScript
"use client";
|
||
import React, { useEffect, useState } from "react";
|
||
import useAudioDevice from "../useAudioDevice";
|
||
import "react-select-search/style.css";
|
||
import "../../../styles/button.css";
|
||
import "../../../styles/form.scss";
|
||
import About from "../../../(aboutAndPrivacy)/about";
|
||
import Privacy from "../../../(aboutAndPrivacy)/privacy";
|
||
import { useRouter } from "next/navigation";
|
||
import useCreateTranscript from "../createTranscript";
|
||
import SelectSearch from "react-select-search";
|
||
import { supportedLatinLanguages } from "../../../supportedLanguages";
|
||
import { useFiefIsAuthenticated } from "@fief/fief/nextjs/react";
|
||
import { featureEnabled } from "../../domainContext";
|
||
|
||
const TranscriptCreate = () => {
|
||
const router = useRouter();
|
||
const isAuthenticated = useFiefIsAuthenticated();
|
||
const requireLogin = featureEnabled("requireLogin");
|
||
|
||
const [name, setName] = useState<string>("");
|
||
const nameChange = (event: React.ChangeEvent<HTMLInputElement>) => {
|
||
setName(event.target.value);
|
||
};
|
||
const [targetLanguage, setTargetLanguage] = useState<string>();
|
||
|
||
const onLanguageChange = (newval) => {
|
||
(!newval || typeof newval === "string") && setTargetLanguage(newval);
|
||
};
|
||
|
||
const createTranscript = useCreateTranscript();
|
||
|
||
const [loadingSend, setLoadingSend] = useState(false);
|
||
|
||
const send = () => {
|
||
if (loadingSend || createTranscript.loading || permissionDenied) return;
|
||
setLoadingSend(true);
|
||
createTranscript.create({ name, target_language: targetLanguage });
|
||
};
|
||
|
||
useEffect(() => {
|
||
createTranscript.transcript &&
|
||
router.push(`/transcripts/${createTranscript.transcript.id}/record`);
|
||
}, [createTranscript.transcript]);
|
||
|
||
useEffect(() => {
|
||
if (createTranscript.error) setLoadingSend(false);
|
||
}, [createTranscript.error]);
|
||
|
||
const { loading, permissionOk, permissionDenied, requestPermission } =
|
||
useAudioDevice();
|
||
|
||
return (
|
||
<>
|
||
<div className="hidden lg:block"></div>
|
||
<div className="lg:grid lg:grid-cols-2 lg:grid-rows-1 lg:gap-4 lg:h-full h-auto flex flex-col">
|
||
<section className="flex flex-col w-full lg:h-full items-center justify-evenly p-4 md:px-6 md:py-8">
|
||
<div className="flex flex-col max-w-xl items-center justify-center">
|
||
<h1 className="text-2xl font-bold mb-2">
|
||
Welcome to reflector.media
|
||
</h1>
|
||
<p>
|
||
Reflector is a transcription and summarization pipeline that
|
||
transforms audio into knowledge.
|
||
<span className="hidden md:block">
|
||
The output is meeting minutes and topic summaries enabling
|
||
topic-specific analyses stored in your systems of record. This
|
||
is accomplished on your infrastructure – without 3rd parties –
|
||
keeping your data private, secure, and organized.
|
||
</span>
|
||
</p>
|
||
<About buttonText="Learn more" />
|
||
<p className="mt-6">
|
||
In order to use Reflector, we kindly request permission to access
|
||
your microphone during meetings and events.
|
||
</p>
|
||
{featureEnabled("privacy") && (
|
||
<Privacy buttonText="Privacy policy" />
|
||
)}
|
||
</div>
|
||
</section>
|
||
<section className="flex flex-col justify-center items-center w-full h-full">
|
||
{requireLogin && !isAuthenticated ? (
|
||
<button
|
||
className="mt-4 bg-blue-400 hover:bg-blue-500 focus-visible:bg-blue-500 text-white font-bold py-2 px-4 rounded"
|
||
onClick={() => router.push("/login")}
|
||
>
|
||
Log in
|
||
</button>
|
||
) : (
|
||
<div className="rounded-xl md:bg-blue-200 md:w-96 p-4 lg:p-6 flex flex-col mb-4 md:mb-10">
|
||
<h2 className="text-2xl font-bold mt-2 mb-2">Try Reflector</h2>
|
||
<label className="mb-3">
|
||
<p>Recording name</p>
|
||
<div className="select-search-container">
|
||
<input
|
||
className="select-search-input"
|
||
type="text"
|
||
onChange={nameChange}
|
||
placeholder="Optional"
|
||
/>
|
||
</div>
|
||
</label>
|
||
|
||
<label className="mb-3">
|
||
<p>Do you want to enable live translation?</p>
|
||
<SelectSearch
|
||
search
|
||
options={supportedLatinLanguages}
|
||
value={targetLanguage}
|
||
onChange={onLanguageChange}
|
||
placeholder="Choose your language"
|
||
/>
|
||
</label>
|
||
|
||
{loading ? (
|
||
<p className="">Checking permissions...</p>
|
||
) : permissionOk ? (
|
||
<p className=""> Microphone permission granted </p>
|
||
) : permissionDenied ? (
|
||
<p className="">
|
||
Permission to use your microphone was denied, please change
|
||
the permission setting in your browser and refresh this page.
|
||
</p>
|
||
) : (
|
||
<button
|
||
className="mt-4 bg-blue-400 hover:bg-blue-500 focus-visible:bg-blue-500 text-white font-bold py-2 px-4 rounded"
|
||
onClick={requestPermission}
|
||
disabled={permissionDenied}
|
||
>
|
||
Request Microphone Permission
|
||
</button>
|
||
)}
|
||
<button
|
||
className="mt-4 bg-blue-400 hover:bg-blue-500 focus-visible:bg-blue-500 text-white font-bold py-2 px-4 rounded"
|
||
onClick={send}
|
||
disabled={!permissionOk || loadingSend}
|
||
>
|
||
{loadingSend ? "Loading..." : "Confirm"}
|
||
</button>
|
||
</div>
|
||
)}
|
||
</section>
|
||
</div>
|
||
</>
|
||
);
|
||
};
|
||
|
||
export default TranscriptCreate;
|