code7-leia 0.1.96 → 0.1.98

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -17,10 +17,10 @@ import EmptyState from '../EmptyState';
17
17
  import Select from '../Select'
18
18
  import AreaUpload from './components/AreaUpload';
19
19
  import { SharedPropsProvider, useSharedProps } from '../../contexts/SharedPropsProvider';
20
- import { deleteFilesAction, getFilesAction } from '../../store/modules/Files/Files.actions';
20
+ import { deleteFilesAction, getFilesAction } from '../../store/modules/actions';
21
21
 
22
22
  export const FileArea = () => {
23
- const { id, language, propTags } = useSharedProps();
23
+ const { id, language, propTags, personas } = useSharedProps();
24
24
  const [files, setFiles] = useState<FileData[]>([]);
25
25
  const [initialFiles, setInitialFiles] = useState<FileData[]>([]);
26
26
  const [uploadFile, setUploadFile] = useState<{ content: ArrayBuffer | string; properties: File }>();
@@ -183,7 +183,7 @@ export const FileArea = () => {
183
183
  }
184
184
 
185
185
  return (
186
- <SharedPropsProvider id={id} language={language} propTags={{ tags: [] }}>
186
+ <SharedPropsProvider id={id} language={language} propTags={{ tags: [] }} personas={personas}>
187
187
  <S.Container>
188
188
  {renderFiles()}
189
189
  </S.Container>
@@ -8,7 +8,7 @@ interface SelectOption {
8
8
 
9
9
  interface SelectProps {
10
10
  options: SelectOption[];
11
- onSelect: (value: string | number) => void;
11
+ onSelect: (value: string) => void;
12
12
  placeholder?: string;
13
13
  }
14
14
 
@@ -6,42 +6,20 @@ import InputTest from './components/InputTest'
6
6
  import { PiWaveformBold } from 'react-icons/pi';
7
7
  import { FaList } from 'react-icons/fa';
8
8
  import EmptyState from '../EmptyState';
9
- // import IconLeia from '../../assets/icon_leia.svg';
9
+ import { SharedPropsProvider, useSharedProps } from '../../contexts/SharedPropsProvider';
10
10
  import { MdPerson2 } from "react-icons/md";
11
+ import { useDispatch, useSelector } from 'react-redux';
12
+ import { testAction } from 'src/store/modules/actions';
11
13
 
12
14
  export const TestArea = () => {
13
- const t = getLanguage('pt-br')
14
- const [results, setResults] = useState({ "message": "" });
15
+ const { id, language, personas, propTags } = useSharedProps();
16
+ const t = getLanguage(language)
17
+ const results = useSelector((state: any) => state.message);
15
18
  const [search, setSearch] = useState('');
16
- const tags = [
17
- "pae",
18
- "boteria",
19
- "vr",
20
- "code7",
21
- "vidalink"
22
- ]
23
- const personas = [
24
- {
25
- "description": "Seriedade e profundidade ao explicar. Usa linguagem acadêmica e é preciso em temas específicos da área.",
26
- "name": "College professor"
27
- },
28
- {
29
- "description": "Abordagem descontraída, direto ao ponto. Linguagem simples, exemplos práticos para facilitar compreensão rápida.",
30
- "name": "School Teacher"
31
- },
32
- {
33
- "description": "Estilo descontraído, senso de humor único. Piadas e trocadilhos até em assuntos sérios.",
34
- "name": "Humorist"
35
- },
36
- {
37
- "description": "Postura centrada, comunicação direta e focada em resultados. Prioriza eficiência e precisão.",
38
- "name": "Military"
39
- },
40
- {
41
- "description": "Estilo único e carismático. Usa linguagem moderna, compartilha informações cativantes de forma descontraída.",
42
- "name": "Digital Influencer"
43
- }
44
- ]
19
+ const [profile, setProfile] = useState('');
20
+ const [presset, setPresset] = useState('');
21
+ const dispatch = useDispatch();
22
+ const tags = propTags ? propTags.tags : [];
45
23
 
46
24
  const optionsPersona = personas.map(persona => {
47
25
  return { label: persona.name, value: persona.description }
@@ -51,12 +29,15 @@ export const TestArea = () => {
51
29
  return { label: tag, value: tag }
52
30
  })
53
31
 
54
- const handleSelect = (value: string | number) => {
55
- console.log(value);
32
+ const handleSelectPersona = (value: string) => {
33
+ setProfile(value);
34
+ };
35
+
36
+ const handleSelectPresset = (value: string) => {
37
+ setPresset(value);
56
38
  };
57
39
 
58
40
  const handleSearch = (value: string) => {
59
- console.log(search)
60
41
  setSearch(value);
61
42
  };
62
43
 
@@ -65,40 +46,40 @@ export const TestArea = () => {
65
46
  };
66
47
 
67
48
  const handleTest = () => {
68
- setResults({
69
- "message": "Você precisa seguir algumas etapas importantes para ter um chatbot perfeito. Primeiro, defina claramente o objetivo do seu chatbot. Em seguida, crie uma mensagem de saudação cativante para atrair a atenção dos usuários. Não se esqueça de pedir feedbacks para melhorar constantemente o desempenho do seu chatbot. Além disso, construa um fluxo de conversa simples e utilize respostas curtas para manter a interação rápida e eficiente. Também é importante incorporar inteligência artificial para tornar o seu chatbot especialista em determinado assunto. Teste o seu bot antes de lançá-lo e personalize-o de acordo com as necessidades dos usuários. Por fim, direcione os usuários para um atendimento humano quando necessário. Seguindo essas dicas, você estará no caminho certo para ter um chatbot perfeito!"
70
- })
49
+ dispatch(testAction(search, profile, presset, id))
71
50
  };
72
51
 
73
52
  return (
74
- <S.Container>
75
- <S.Header>
76
- <div className='infos'>
77
- <h2>{t.test}</h2>
78
- <p>{t.testArea.description}</p>
79
- </div>
80
- </S.Header>
81
- <S.Inputs>
82
- <InputTest placeholder={t.testArea.typeSentence} onChange={handleSearch} onRecordAudio={handleRecordAudio} />
83
- <Select placeholder={t.testArea.selectPersona} options={optionsPersona} onSelect={handleSelect} />
84
- <Select placeholder={t.testArea.selectPresset} options={optionsPresset} onSelect={handleSelect} />
85
- <button onClick={handleTest}><PiWaveformBold /> {t.buttons.test}</button>
86
- </S.Inputs>
87
- {
88
- results.message === '' ? (
89
- <EmptyState
90
- icon={<FaList></FaList>}
91
- title={t.testArea.emptyState.title}
92
- description={t.testArea.emptyState.description}
93
- activeButton={false}
94
- />
95
- ) : <S.Result>
96
- <div className='icon'>
97
- <MdPerson2 />
98
- </div>
99
- <div className='text'>{results.message}</div>
100
- </S.Result>
101
- }
102
- </S.Container>
53
+ <SharedPropsProvider id={id} language={language} propTags={{ tags: [] }} personas={personas}>
54
+ <S.Container>
55
+ <S.Header>
56
+ <div className='infos'>
57
+ <h2>{t.test}</h2>
58
+ <p>{t.testArea.description}</p>
59
+ </div>
60
+ </S.Header>
61
+ <S.Inputs>
62
+ <InputTest placeholder={t.testArea.typeSentence} onChange={handleSearch} onRecordAudio={handleRecordAudio} />
63
+ <Select placeholder={t.testArea.selectPersona} options={optionsPersona} onSelect={handleSelectPersona} />
64
+ <Select placeholder={t.testArea.selectPresset} options={optionsPresset} onSelect={handleSelectPresset} />
65
+ <button onClick={handleTest}><PiWaveformBold /> {t.buttons.test}</button>
66
+ </S.Inputs>
67
+ {
68
+ results.message === '' ? (
69
+ <EmptyState
70
+ icon={<FaList></FaList>}
71
+ title={t.testArea.emptyState.title}
72
+ description={t.testArea.emptyState.description}
73
+ activeButton={false}
74
+ />
75
+ ) : <S.Result>
76
+ <div className='icon'>
77
+ <MdPerson2 />
78
+ </div>
79
+ <div className='text'>{results.message}</div>
80
+ </S.Result>
81
+ }
82
+ </S.Container>
83
+ </SharedPropsProvider>
103
84
  );
104
85
  };
@@ -5,6 +5,7 @@ interface Props {
5
5
  id: string;
6
6
  language: "en" | "pt-br" | "es";
7
7
  propTags: { tags: [] }
8
+ personas: [{ name: string, description: string }]
8
9
  children?: React.ReactNode;
9
10
  }
10
11
 
@@ -25,6 +26,7 @@ export const useSharedProps = () => {
25
26
  export const SharedPropsProvider: React.FC<Props> = ({ children, ...props }) => {
26
27
  const { id } = props;
27
28
  const [tags, setTags] = useState<any>(null);
29
+ const [personas, setPersonas] = useState<any>(null);
28
30
 
29
31
  useEffect(() => {
30
32
  const fetchData = async () => {
@@ -41,12 +43,28 @@ export const SharedPropsProvider: React.FC<Props> = ({ children, ...props }) =>
41
43
  }
42
44
  };
43
45
 
46
+ const personas = async () => {
47
+ try {
48
+ const { data } = await api.get(`/personas`);
49
+
50
+ if (data) {
51
+ setPersonas(data);
52
+ } else {
53
+ console.error('Erro ao fazer a solicitação');
54
+ }
55
+ } catch (error) {
56
+ console.error('Erro ao fazer a solicitação:', error);
57
+ }
58
+ };
59
+
44
60
  fetchData();
61
+ personas();
45
62
  }, [id]);
46
63
 
47
64
  const sharedProps = {
48
65
  ...props,
49
66
  propTags: tags,
67
+ personas,
50
68
  };
51
69
 
52
70
  return (
@@ -1,13 +1,13 @@
1
1
  import { createStore, applyMiddleware } from 'redux';
2
2
  import createSagaMiddleware from 'redux-saga';
3
- import FilesReducer from './modules/Files/Files.reducer';
4
- import FilesSagas from './modules/Files/Files.sagas';
3
+ import Reducer from './modules/reducer';
4
+ import Sagas from './modules/sagas';
5
5
 
6
6
  const sagaMiddleware = createSagaMiddleware();
7
7
 
8
- const store = createStore(FilesReducer, applyMiddleware(sagaMiddleware));
8
+ const store = createStore(Reducer, applyMiddleware(sagaMiddleware));
9
9
 
10
- sagaMiddleware.run(FilesSagas);
10
+ sagaMiddleware.run(Sagas);
11
11
 
12
12
  export default store;
13
13
 
@@ -1,4 +1,4 @@
1
- import types from './Files.types'
1
+ import types from './types'
2
2
 
3
3
  export const getFilesAction = (id: string) => {
4
4
  return {
@@ -26,4 +26,18 @@ export const deleteFilesActionSuccess = ({ files }: any) => {
26
26
  type: types.DELETE_FILES_SUCCESS,
27
27
  payload: { files }
28
28
  }
29
+ }
30
+
31
+ export const testAction = (question: string, profile: string, presset: string, files_directory: string) => {
32
+ return {
33
+ type: types.TEST_REQUEST,
34
+ payload: { question, profile, presset, files_directory }
35
+ }
36
+ }
37
+
38
+ export const testActionSuccess = ({ message }: any) => {
39
+ return {
40
+ type: types.TEST_SUCCESS,
41
+ payload: { message }
42
+ }
29
43
  }
@@ -1,8 +1,9 @@
1
1
  import { produce } from 'immer';
2
- import types from './Files.types'
2
+ import types from './types'
3
3
 
4
4
  const INITIAL_STATE = {
5
- files: []
5
+ files: [],
6
+ message: ''
6
7
  }
7
8
 
8
9
  export default function filesReducer(state = INITIAL_STATE, action: any) {
@@ -14,6 +15,9 @@ export default function filesReducer(state = INITIAL_STATE, action: any) {
14
15
  case types.DELETE_FILES_SUCCESS:
15
16
  draft.files = action.payload.files;
16
17
  break;
18
+ case types.TEST_SUCCESS:
19
+ draft.message = action.payload.message;
20
+ break;
17
21
  default:
18
22
  return action.payload;
19
23
  }
@@ -1,7 +1,7 @@
1
1
  import { takeLatest, all, put, call } from 'redux-saga/effects';
2
- import api from '../../../service/Api'
3
- import Types from './Files.types'
4
- import { getFilesActionSuccess, deleteFilesActionSuccess } from './Files.actions'
2
+ import api from '../../service/Api'
3
+ import Types from './types'
4
+ import { getFilesActionSuccess, deleteFilesActionSuccess, testActionSuccess } from './actions'
5
5
 
6
6
  export function* getFilesSaga(action: any) {
7
7
  try {
@@ -20,13 +20,24 @@ export function* deleteFilesSaga(action: any) {
20
20
  const { data } = yield call(api.get, `/files/${id}`);
21
21
  yield put(deleteFilesActionSuccess({ files: data.files }));
22
22
  } catch (error) {
23
- console.log('-----------getFiles.error------------------->', error);
23
+ console.log('-----------deleteFilesSaga.error------------------->', error);
24
+ }
25
+ }
26
+
27
+ export function* testSaga(action: any) {
28
+ try {
29
+ const { question, profile, presset, files_directory } = action.payload
30
+ const { data } = yield call(api.post, `/ask`, { question, profile, presset, files_directory });
31
+ yield put(testActionSuccess({ message: data.message }));
32
+ } catch (error) {
33
+ console.log('-----------testSaga.error------------------->', error);
24
34
  }
25
35
  }
26
36
 
27
37
  export default function* filesSagas() {
28
38
  yield all([
29
39
  takeLatest(Types.GET_FILES_REQUEST, getFilesSaga),
30
- takeLatest(Types.DELETE_FILES_REQUEST, deleteFilesSaga)
40
+ takeLatest(Types.DELETE_FILES_REQUEST, deleteFilesSaga),
41
+ takeLatest(Types.TEST_REQUEST, testSaga)
31
42
  ]);
32
43
  }
@@ -2,7 +2,9 @@ const Types = {
2
2
  GET_FILES_REQUEST: '@files/GET_FILES_REQUEST',
3
3
  GET_FILES_SUCCESS: '@files/GET_FILES_SUCCESS',
4
4
  DELETE_FILES_REQUEST: '@files/DELETE_FILES_REQUEST',
5
- DELETE_FILES_SUCCESS: '@files/DELETE_FILES_SUCCESS'
5
+ DELETE_FILES_SUCCESS: '@files/DELETE_FILES_SUCCESS',
6
+ TEST_REQUEST: '@files/TEST_REQUEST',
7
+ TEST_SUCCESS: '@files/TEST_SUCCESS'
6
8
  };
7
9
 
8
10
  export default Types;