chat / client /src /components /Prompts /SharePrompt.tsx
Zhitomir's picture
chat init
aa2e6af
Raw
History Blame Contribute Delete
4.82 kB
import React, { useEffect, useMemo } from 'react';
import { Share2Icon } from 'lucide-react';
import { useForm, Controller } from 'react-hook-form';
import { Permissions } from 'librechat-data-provider';
import { useGetStartupConfig } from 'librechat-data-provider/react-query';
import type {
TPromptGroup,
TStartupConfig,
TUpdatePromptGroupPayload,
} from 'librechat-data-provider';
import {
OGDialog,
OGDialogTitle,
OGDialogContent,
OGDialogTrigger,
OGDialogClose,
} from '~/components/ui';
import { useUpdatePromptGroup } from '~/data-provider';
import { Button, Switch } from '~/components/ui';
import { useToastContext } from '~/Providers';
import { useLocalize } from '~/hooks';
type FormValues = {
[Permissions.SHARED_GLOBAL]: boolean;
};
const SharePrompt = ({ group, disabled }: { group?: TPromptGroup; disabled: boolean }) => {
const localize = useLocalize();
const { showToast } = useToastContext();
const updateGroup = useUpdatePromptGroup();
const { data: startupConfig = {} as TStartupConfig, isFetching } = useGetStartupConfig();
const { instanceProjectId } = startupConfig;
const groupIsGlobal = useMemo(
() => !!group?.projectIds?.includes(instanceProjectId),
[group, instanceProjectId],
);
const {
control,
setValue,
getValues,
handleSubmit,
formState: { isSubmitting },
} = useForm<FormValues>({
mode: 'onChange',
defaultValues: {
[Permissions.SHARED_GLOBAL]: groupIsGlobal,
},
});
useEffect(() => {
setValue(Permissions.SHARED_GLOBAL, groupIsGlobal);
}, [groupIsGlobal, setValue]);
if (!group || !instanceProjectId) {
return null;
}
const onSubmit = (data: FormValues) => {
if (!group._id || !instanceProjectId) {
return;
}
const payload = {} as TUpdatePromptGroupPayload;
if (data[Permissions.SHARED_GLOBAL]) {
payload.projectIds = [startupConfig.instanceProjectId];
} else {
payload.removeProjectIds = [startupConfig.instanceProjectId];
}
updateGroup.mutate({
id: group._id,
payload,
});
};
return (
<OGDialog>
<OGDialogTrigger asChild>
<Button
variant={'default'}
size={'sm'}
className="h-10 w-10 border border-transparent bg-blue-500/90 transition-all hover:bg-blue-600 dark:bg-blue-600 dark:hover:bg-blue-800"
disabled={disabled}
>
<Share2Icon className="cursor-pointer text-white " />
</Button>
</OGDialogTrigger>
<OGDialogContent className="bg-white dark:border-gray-700 dark:bg-gray-850 dark:text-gray-300">
<OGDialogTitle>{localize('com_ui_share_var', `"${group.name}"`)}</OGDialogTitle>
<form className="p-2" onSubmit={handleSubmit(onSubmit)}>
<div className="mb-4 flex items-center justify-between gap-2 py-4">
<label
className="cursor-pointer select-none"
htmlFor={Permissions.SHARED_GLOBAL}
onClick={() =>
setValue(Permissions.SHARED_GLOBAL, !getValues(Permissions.SHARED_GLOBAL), {
shouldDirty: true,
})
}
>
{localize('com_ui_share_to_all_users')}
{groupIsGlobal && (
<span className="ml-2 text-xs">{localize('com_ui_prompt_shared_to_all')}</span>
)}
</label>
<Controller
name={Permissions.SHARED_GLOBAL}
control={control}
disabled={isFetching || updateGroup.isLoading || !instanceProjectId}
rules={{
validate: (value) => {
const isValid = !(value && groupIsGlobal);
if (!isValid) {
showToast({
message: localize('com_ui_prompt_already_shared_to_all'),
status: 'warning',
});
}
return isValid;
},
}}
render={({ field }) => (
<Switch
{...field}
checked={field.value}
onCheckedChange={field.onChange}
value={field?.value?.toString()}
/>
)}
/>
</div>
<div className="flex justify-end">
<OGDialogClose asChild>
<button
type="submit"
disabled={isSubmitting || isFetching}
className="btn rounded bg-green-500 font-bold text-white transition-all hover:bg-green-600"
>
{localize('com_ui_save')}
</button>
</OGDialogClose>
</div>
</form>
</OGDialogContent>
</OGDialog>
);
};
export default SharePrompt;