Faisal Amir 2394c13065
ui: standalone UIKit and refactor (#557)
* Eslint import order

* Initial Uikit

* Rename file with camelCase

* Remove unused code

* Remove unused code

* Set position traficlight mac

* Grouping Ribbon, Topbar and Bottombar as layout

* Added image brand

* Moving feature toggle into context folder

* Fix active state of setting menu

* Cleanup downloadModel atom helper

* Cleanup useGetConfigureModel

* Added wave animation

* Create useMainViewState intead of import helper atom

* Remove unused code

* Take a back switch ui

* Toggle using switch component

* Add dynamic primary color

* Cleanup import

* Added uikit scroll area

* Add best practice form

* Added toaster container

* Fix loader container

* Add hooks useDownloadState

* Added tooltip on ribbon menu

* Added case user multiple download model

* Adjust input style with bigger ring

* Restyle my model screen

* Replace useStartStop model with useActiveModel

* Import icon using Icon name

* Fix missing login loading start and stop model

* WIP integrate with cmdk

* Move layout search bar on middle of app

* Added function cancel download

* Cleanup model explore

* Cleanup unused code

* Move app version in bototmbar or footer

* WIP chat screen

* WIP chat screen

* Cleanup style and remove unsed code

* Added command for showing downloaded model

* Fix missing keyframe loader dot animation

* Conditional loader of plugin setting

* WIP history list message

* chore: rebase main

* Adding script ui into root package

* Fix different version react hooks form

* Add close toaster

* Added status model active or not on list of command

* Conditional showing info if user don't have a model

* Disabled toolbar chat when user not yet have convo

* chore: fix state

* fix: get resource atom

* Fix conditional bottom bar

* fix: model download state

* Fix font

* Improve icon my model

* Add toaster delete chat

* Remove test classname

* Fix scroll chat body

* Fix scrolling chat body

* chore: add message update

* Add uikit into depedencies on root package

* Update chat flow

* Fix hot reload ui changes

* Increate background color chat screen light mode

* Added visual conversation active state

* Added build:uikit on gh actions

* chore: attempt to fix CI

* fix: deps

* fix: tests

* chore: attempt to fix CI

---------

Co-authored-by: Louis <louis@jan.ai>
2023-11-07 21:27:11 +07:00

102 lines
2.7 KiB
TypeScript

/* eslint-disable @typescript-eslint/no-explicit-any */
type Props = {
pluginName: string
preferenceValues: any
preferenceItems: any
}
import { useForm } from 'react-hook-form'
import { zodResolver } from '@hookform/resolvers/zod'
import {
Form,
FormControl,
FormDescription,
FormField,
FormItem,
Input,
FormLabel,
FormMessage,
Button,
} from '@janhq/uikit'
import * as z from 'zod'
import { toaster } from '@/containers/Toast'
import { formatPluginsName } from '@/utils/converter'
const PreferencePlugins = (props: Props) => {
const { pluginName, preferenceValues, preferenceItems } = props
const FormSchema = z.record(
z
.string({ required_error: 'Field is Required' })
.min(1, { message: 'Field is Required' })
)
const form = useForm<z.infer<typeof FormSchema>>({
resolver: zodResolver(FormSchema),
defaultValues: preferenceValues.reduce(
(obj: any, item: { key: any; value: any }) =>
Object.assign(obj, { [item.key]: item.value }),
{}
),
})
const onSubmit = async (values: z.infer<typeof FormSchema>) => {
for (const [key, value] of Object.entries(values)) {
// await preferences.set(pluginName, key, value)
// await execute(PluginService.OnPreferencesUpdate, {})
}
toaster({
title: formatPluginsName(pluginName),
description: 'Success update preferences',
})
}
return (
<div className="mx-auto w-full lg:mt-10 lg:w-1/2">
<h6 className="mb-6 text-lg font-semibold capitalize">
{formatPluginsName(pluginName)}
</h6>
<Form {...form}>
<form onSubmit={form.handleSubmit(onSubmit)} className="space-y-4">
{preferenceItems
.filter((x: any) => x.pluginName === pluginName)
?.map((e: any) => (
<FormField
key={e.preferenceKey}
control={form.control}
name={e.preferenceKey}
render={({ field }) => (
<FormItem>
<FormLabel>{e.preferenceName}</FormLabel>
<FormDescription className="mb-2">
{e.preferenceDescription}
</FormDescription>
<FormControl>
<Input
placeholder={`Enter your ${e.preferenceName}`}
{...field}
/>
</FormControl>
<FormMessage />
</FormItem>
)}
/>
))}
<div className="pt-4">
<Button type="submit" block>
Submit
</Button>
</div>
</form>
</Form>
</div>
)
}
export default PreferencePlugins