@@ -7,3 +7,4 @@ export { usePendingStore } from '#/features/pending/model/use-pending-store' export { useSettingsStore } from '#/entities/user-account/model/use-settings-store' export { useUserReferralStore } from '#/entities/user-account/model/use-user-referral-store' export { useUserStore } from '#/entities/user-account/model/use-user-store' +export { useStepperStore } from '#/features/register-business/model/use-stepper-store' @@ -1,6 +1,7 @@ -import { api } from '#/shared/api' import { BalanceDTO } from '../types' +import { api } from '#/shared/api' + export function getBalance() { return api.get('/payments/user-balance') } @@ -1,8 +1,10 @@ +import { getBalance } from '../api' + +import { useBalanceStore } from './use-balance-store' + import { withPending } from '#/shared' import { makePrivateRequest } from '#/shared/api' import { useShowDataStore } from '#/shared/lib/hooks' -import { getBalance } from '../api' -import { useBalanceStore } from './use-balance-store' export function useBalance() { const { balance, setBalance } = useBalanceStore() @@ -1,6 +1,7 @@ -import { api } from '#/shared/api' import { ChatDTO, CreateChatDTO } from '../types' +import { api } from '#/shared/api' + export async function putChat(uid: string, data: Partial) { return await api.put(`/chats/${uid}/`, data) } @@ -1,4 +1,5 @@ import { create } from 'zustand' + import { ChatDTO } from '../types' export interface ChatsStore { @@ -1,11 +1,14 @@ -import { makePrivateRequest } from '#/shared/api' -import { useShowDataStore } from '#/shared/lib/hooks' +import { useEffect, useState } from 'react' + import { postChat, putChat, removeChat } from '../api' -import { useChatsStore } from '.' import { CreateChatDTO } from '../types' -import { useCurrentChat } from '#/features/chats' -import { useEffect, useState } from 'react' + +import { useChatsStore } from '.' + import { useChatBotParams } from '#/entities/model-entity' +import { useCurrentChat } from '#/features/chats' +import { makePrivateRequest } from '#/shared/api' +import { useShowDataStore } from '#/shared/lib/hooks' export function useChatActions() { const { botParams } = useChatBotParams() @@ -1,4 +1,5 @@ import { create } from 'zustand' + import { ChatDTO } from '#/entities/chat/types' interface CurrentChatStore { @@ -1,7 +1,9 @@ -import { getPopupById, PopupTemplate } from '#/shared/ui/popup' -import { POPUP_CHAT_BOT_PARAMS } from '#/shared/ui/popup' import React from 'react' + import styles from './chat-bot-options-popup.module.scss' + +import { getPopupById, PopupTemplate } from '#/shared/ui/popup' +import { POPUP_CHAT_BOT_PARAMS } from '#/shared/ui/popup' import { ChatModelOptions } from '#/widgets/chat-model-options' export const ChatBotOptionsPopup = () => { @@ -1,17 +1,19 @@ -import { ChatItemActionsPopup } from '#/features/chat-item-actions' -import { useCurrentChat } from '#/features/chats' -import { CommonInput } from '#/shared/ui/common-input' import React, { forwardRef, useEffect, useRef, useState } from 'react' + +import { useChatActions } from '../model' import { ChatDTO } from '../types' + import styles from './chat-button.module.scss' -import RenameSvg from '#/assets/svg/rename.svg?react' import ChatSettingsSvg from '#/assets/svg/chat-settings.svg?react' -import { PopupTemplateVertical, getPopupById } from '#/shared/ui/popup' -import { c } from '#/shared' -import { useChatActions } from '../model' -import { ChatMobileRename } from '#/features/chat-mobile-rename/ui/chat-mobile-rename-popup' +import RenameSvg from '#/assets/svg/rename.svg?react' import { useChatBotMessages } from '#/entities/message' +import { ChatItemActionsPopup } from '#/features/chat-item-actions' +import { ChatMobileRename } from '#/features/chat-mobile-rename/ui/chat-mobile-rename-popup' +import { useCurrentChat } from '#/features/chats' +import { c } from '#/shared' +import { CommonInput } from '#/shared/ui/common-input' +import { getPopupById,PopupTemplateVertical } from '#/shared/ui/popup' interface ChatButtonProps extends ChatDTO { popupVertical?: PopupTemplateVertical @@ -1,4 +1,5 @@ import { Message, MessageSend } from '../types' + import { api } from '#/shared/api' export async function getMessagesBySlug(chat: string, offset?: number, limit = 10) { @@ -1,9 +1,11 @@ -import { API_URL } from '#/shared/lib/constants' -import { IMessageRequest } from '#/shared/lib/types/types-gpt' import axios, { AxiosResponse } from 'axios' + import { MediaMessageListResponse, Message, MessageSend } from '../types' + import { api } from '#/shared/api' +import { API_URL } from '#/shared/lib/constants' import { objectToFormdata } from '#/shared/lib/helpers/form' +import { IMessageRequest } from '#/shared/lib/types/types-gpt' export async function postImageMessage(uid: string, dto: MessageSend) { return await api.post(`/media/image/${uid}`, objectToFormdata(dto)) @@ -1,4 +1,5 @@ import { create } from 'zustand' + import { Message } from '../types' export interface ChatBotMessagesStore { @@ -1,4 +1,5 @@ import { create } from 'zustand' + import { Message } from '../types' export interface ImageBotMessagesStore { @@ -1,10 +1,13 @@ -import { useCurrentChat } from '#/features/chats' -import { AsyncQueue, EventBus, eventBus } from '#/shared/classes' -import { useEventSource } from '#/shared/lib/event-source' import { useCallback } from 'react' + import { MessageEventStreamResponse } from '../types' + import { useChatBotMessages } from './chat-bot-messages.store' +import { useCurrentChat } from '#/features/chats' +import { AsyncQueue, EventBus, eventBus } from '#/shared/classes' +import { useEventSource } from '#/shared/lib/event-source' + export function useChatMessagesEvents() { const { event, addOpenCallback } = useEventSource() const { currentChat } = useCurrentChat() @@ -1,6 +1,7 @@ -import { useShowDataStore } from '#/shared/lib/hooks/use-show-data' import { useState } from 'react' +import { useShowDataStore } from '#/shared/lib/hooks/use-show-data' + export function useImageIcons() { const [iconsMenu, setIconsMenu] = useState('') const { showMessage } = useShowDataStore() @@ -1,12 +1,15 @@ -import { useCurrentChat } from '#/features/chats' -import { AsyncQueue, EventBus, eventBus } from '#/shared/classes' -import { useEventSource } from '#/shared/lib/event-source' import { useCallback, useEffect, useRef, useState } from 'react' + import { MessageEventStreamResponse } from '../types' + import { useChatBotMessages } from './chat-bot-messages.store' -import { useImageObjectId } from '#/features/image-object-id' import { useImageBotMessages } from './image-bot-messages.store' + +import { useCurrentChat } from '#/features/chats' +import { useImageObjectId } from '#/features/image-object-id' import { addBase64Padding, base64Decode, validateBase64 } from '#/shared' +import { AsyncQueue, EventBus, eventBus } from '#/shared/classes' +import { useEventSource } from '#/shared/lib/event-source' export function useImageMessagesEvents() { const chunks = useRef([]) @@ -1,14 +1,17 @@ import { useState } from 'react' -import { Message, MessageSend } from '../types' -import { makePrivateRequest } from '#/shared/api' + import { postMessage } from '../api' -import { getBlobFromUrl } from '#/shared' +import { Message, MessageSend } from '../types' + +import { useChatBotMessages } from './chat-bot-messages.store' + import { useParamsStore } from '#/app/store/use-params-store' import { useChatBot } from '#/entities/model-entity' -import { useShowDataStore } from '#/shared/lib/hooks/use-show-data' -import { useChatBotMessages } from './chat-bot-messages.store' import { useCurrentChat } from '#/features/chats' import { useModelInputStore } from '#/features/model-input/model' +import { getBlobFromUrl } from '#/shared' +import { makePrivateRequest } from '#/shared/api' +import { useShowDataStore } from '#/shared/lib/hooks/use-show-data' import { useChatWindowContext } from '#/widgets/chat-window/model' export function useUserMessageActions(message: Message) { @@ -1,5 +1,6 @@ -import { useMemo, useState } from "react" -import { Message } from "../types" +import { useMemo, useState } from 'react' + +import { Message } from '../types' export function useUserMessageImage(message: Message) { @@ -1,8 +1,10 @@ import React, { useMemo } from 'react' - -import styles from './archive-image-message.module.scss' import Link from 'next/link' + import { Message } from '../types' + +import styles from './archive-image-message.module.scss' + import { fileIsLink } from '#/shared' interface ArchiveImageMessageProps extends Message {} @@ -1,18 +1,20 @@ import React, { forwardRef, memo, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react' -import styles from './bot-message.module.scss' +import { CSSTransition,TransitionGroup } from 'react-transition-group' -import { Markdown } from '#/widgets/markdown/markdown' -import { c, formatDate } from '#/shared/lib/helpers' -import { Model } from '#/entities/model-entity' import { Message } from '../types' -import { useThemeAndDevice } from '#/shared/lib/hooks' + +import styles from './bot-message.module.scss' + import AvatarSvg from '#/assets/svg/avatar.svg?react' import DocSvg from '#/assets/svg/doc.svg?react' import MenuSvg from '#/assets/svg/menu.svg?react' -import { CommonTooltip, CommonTooltipPosition } from '#/shared/ui/tooltip' +import { Model } from '#/entities/model-entity' import { UserMessageActionsPopup } from '#/features/user-message-actions-popup' +import { c, formatDate } from '#/shared/lib/helpers' +import { useThemeAndDevice } from '#/shared/lib/hooks' import { getPopupById } from '#/shared/ui/popup' -import { TransitionGroup, CSSTransition } from 'react-transition-group' +import { CommonTooltip, CommonTooltipPosition } from '#/shared/ui/tooltip' +import { Markdown } from '#/widgets/markdown/markdown' export interface BotMessageProps { model: Model @@ -1,15 +1,18 @@ import React, { useEffect, useMemo, useState } from 'react' +import Image from 'next/image' +import { useMediaQuery } from 'usehooks-ts' -import styles from './file-image-message.module.scss' -import { CommonTooltip } from '#/shared/ui/tooltip' import { Message } from '../types' -import { c, cutString } from '#/shared' + import { ImageIcons } from './image-icons' + +import styles from './file-image-message.module.scss' + import PhorographSvg from '#/assets/svg/photograph.svg?react' -import Image from 'next/image' -import { useMediaQuery } from 'usehooks-ts' -import { useEventStore } from '#/shared/lib/event-source' +import { c, cutString } from '#/shared' import { eventBus } from '#/shared/classes' +import { useEventStore } from '#/shared/lib/event-source' +import { CommonTooltip } from '#/shared/ui/tooltip' interface FileImageMessageProps extends Message {} @@ -1,12 +1,15 @@ -import { PopupTemplate, getPopupById } from '#/shared/ui/popup' import React from 'react' -import styles from './image-icons-popup.module.scss' -import { Message } from '../types' -import { CommonTooltip } from '#/shared/ui/tooltip' +import { CSSTransition } from 'react-transition-group' + import { useImageIcons } from '../model' +import { Message } from '../types' + +import styles from './image-icons-popup.module.scss' + import BlankLinkSvg from '#/assets/svg/blank-link.svg?react' import DownloadSvg from '#/assets/svg/download.svg?react' -import { CSSTransition } from 'react-transition-group' +import { getPopupById,PopupTemplate } from '#/shared/ui/popup' +import { CommonTooltip } from '#/shared/ui/tooltip' interface ImageIconsPopupProps extends Message {} @@ -1,13 +1,16 @@ -import { TooltipCustom, c } from '#/shared' -import { Grow, Box } from '@mui/material' -import { Message } from '../types' +import { Box,Grow } from '@mui/material' + import { useImageIcons } from '../model' -import GamburgerSvg from '#/assets/svg/gamburger.svg?react' +import { Message } from '../types' + +import { ImageIconsPopup } from './image-icons-popup' import styles from './image-icons.module.scss' + +import GamburgerSvg from '#/assets/svg/gamburger.svg?react' +import { c,TooltipCustom } from '#/shared' import { getPopupById } from '#/shared/ui/popup' -import { ImageIconsPopup } from './image-icons-popup' export interface ImageIconsProps extends Message {} @@ -1,11 +1,14 @@ import React, { CSSProperties, MouseEventHandler, useEffect, useMemo } from 'react' -import styles from './image-message.module.scss' -import { c } from '#/shared' import { Message } from '../types' + import { ArchiveImageMessage } from './archive-image-message' import { FileImageMessage } from './file-image-message' +import styles from './image-message.module.scss' + +import { c } from '#/shared' + interface ImageMessageProps extends Message { onClick?: MouseEventHandler className?: string @@ -1,19 +1,20 @@ import React, { forwardRef, memo, useMemo, useState } from 'react' import Image from 'next/image' -import { c, formatDate, stringIsImage } from '#/shared/lib/helpers' +import { useUserMessageActions, useUserMessageImage } from '../model' +import { Message } from '../types' + import styles from './user-message.module.scss' -import { CommonTooltip, CommonTooltipPosition } from '#/shared/ui/tooltip' -import MenuSvg from '#/assets/svg/menu.svg?react' import DocSvg from '#/assets/svg/doc.svg?react' +import MenuSvg from '#/assets/svg/menu.svg?react' import WarningSvg from '#/assets/svg/warning.svg?react' -import { UserMessageActionsPopup } from '#/features/user-message-actions-popup' -import { getPopupById } from '#/shared/ui/popup' import { Model } from '#/entities/model-entity' -import { useUserMessageActions, useUserMessageImage } from '../model' -import { Message } from '../types' import { GALLERY_IMAGES, getModalById } from '#/features/modals' +import { UserMessageActionsPopup } from '#/features/user-message-actions-popup' +import { c, formatDate, stringIsImage } from '#/shared/lib/helpers' +import { getPopupById } from '#/shared/ui/popup' +import { CommonTooltip, CommonTooltipPosition } from '#/shared/ui/tooltip' interface UserMessageProps { message: Message @@ -1,4 +1,5 @@ import { Inference, Model, ShortModel } from '../types' + import { api } from '#/shared/api' export async function getBotParams(slug: string) { @@ -10,5 +11,5 @@ export async function getInference(id: string) { } export async function getChatBots() { - return await api.get(`api/chats/models/`) + return await api.get('api/chats/models/') } @@ -1,6 +1,7 @@ import { ShortModel } from '../types' + import { api } from '#/shared/api' export async function getImageBots() { - return await api.get(`api/media/images/models/`) + return await api.get('api/media/images/models/') } @@ -1,5 +1,6 @@ import { create } from 'zustand' -import { Inference, Model, InferenceParams, InferenceInput } from '../types' + +import { Inference, InferenceInput,InferenceParams, Model } from '../types' export interface ChatBotParamsStore { botParams: Model | null @@ -1,10 +1,13 @@ import { useEffect } from 'react' -import { makePrivateRequest } from '#/shared/api' -import { getBotParams, getInference } from '../api' import { useRouter } from 'next/router' -import { useChatBotParams } from '.' + +import { getBotParams, getInference } from '../api' import { Inference } from '../types' +import { useChatBotParams } from '.' + +import { makePrivateRequest } from '#/shared/api' + export function useChatBot() { const { botParams, @@ -1,5 +1,6 @@ import { create } from 'zustand' -import { Inference, Model, InferenceParams, InferenceInput } from '../types' + +import { Inference, InferenceInput,InferenceParams, Model } from '../types' export interface ImageBotParamsStore { botParams: Model | null @@ -1,10 +1,13 @@ import { version } from 'react' -import { getBotParams, getInference } from '../api' -import { makePrivateRequest } from '#/shared/api' import { useRouter } from 'next/router' + +import { getBotParams, getInference } from '../api' + import { useChatBotParams } from './use-chat-bot-params.store' import { useImageBotParams } from './use-image-bot-params.store' +import { makePrivateRequest } from '#/shared/api' + export function useImageBot() { const { botParams, @@ -1,6 +1,8 @@ -import { POPUP_IMAGE_BOT_PARAMS, PopupTemplate } from '#/shared/ui/popup' import React from 'react' + import styles from './image-bot-options-popup.module.scss' + +import { POPUP_IMAGE_BOT_PARAMS, PopupTemplate } from '#/shared/ui/popup' import { ImageModelOptions } from '#/widgets/image-model-options' export const ImageBotOptionsPopup = () => { @@ -1,9 +1,9 @@ import axios from 'axios' -import { API_URL } from '#/shared/lib/constants' - import { IUserSetting } from '../model/types' +import { API_URL } from '#/shared/lib/constants' + export const addUserSettings = async ( token: string, setting: Omit @@ -1,8 +1,9 @@ import axios, { AxiosResponse } from 'axios' -import { API_URL } from '#/shared/lib/constants' import { AccountType } from '../types' +import { API_URL } from '#/shared/lib/constants' + export const getAccountType = async (token: string | null | undefined): Promise => { if (!token) { return 'regular' @@ -1,8 +1,10 @@ -import { api } from '#/shared/api' -import { API_URL } from '#/shared/lib/constants' import { Agent } from 'https' + import { IUserSetting } from '../model/types' +import { api } from '#/shared/api' +import { API_URL } from '#/shared/lib/constants' + export function getUserSettings() { return api.get('/api/users/settings/') } @@ -1,10 +1,10 @@ import axios from 'axios' -import { API_URL } from '#/shared/lib/constants' - import { getUpdatedSettingsLocal } from '../lib/helpers/update-setting-local' import { IUserSetting, SettingValueType } from '../model/types' +import { API_URL } from '#/shared/lib/constants' + export const updateUserSettings = async ( token: string, id: string, @@ -1,6 +1,7 @@ -import { api } from '#/shared/api' import { UserDTO } from '../types' +import { api } from '#/shared/api' + export function getUserApi() { return api.get('/auth/me') } @@ -1,7 +1,7 @@ -import { Device } from '#/shared/lib/types/entities' - import { IUserSetting, SettingType } from '../../model/types' +import { Device } from '#/shared/lib/types/entities' + interface IProps { settings: Omit | null targetType: SettingType @@ -1,13 +1,15 @@ -import { createUseContext } from '#/shared' import { createContext, useContext } from 'react' + import { useGlobalSettings } from './use-global-settings' +import { createUseContext } from '#/shared' + export const UserSettingsContext = createContext | null>(null) export const useUserSettingsContext = () => { const contextValue = useContext(UserSettingsContext) if (!contextValue) { - throw new Error("useContext must be inside a Provider with a value") + throw new Error('useContext must be inside a Provider with a value') } return contextValue } @@ -1,11 +1,14 @@ +import { useCallback, useEffect, useRef, useState } from 'react' +import { useSession } from 'next-auth/react' import { useLocalStorage } from 'usehooks-ts' + +import { getUserSettings, postUserSettings, updateUserSettings } from '../api' + import { IUserSetting } from './types' + +import { getDeviceType } from '#/shared' import { makePrivateRequest } from '#/shared/api' -import { getUserSettings, postUserSettings, updateUserSettings } from '../api' import { useShowDataStore } from '#/shared/lib/hooks' -import { getDeviceType } from '#/shared' -import { useCallback, useEffect, useRef, useState } from 'react' -import { useSession } from 'next-auth/react' export function useGlobalSettings() { const [settings, setSettings] = useLocalStorage('global_settings', []) @@ -106,3 +106,5 @@ export const useUserReferralStore = create((set, get) => { getAll, } }) + +export type { ResponseAllInfo } @@ -1,4 +1,5 @@ import { create } from 'zustand' + import { UserDTO } from '../types' export interface UserStore { @@ -1,8 +1,10 @@ +import { getUserApi } from '../api' + +import { useUserStore } from './use-user-store' + import { patchEmail } from '#/features/auth' import { makePrivateRequest } from '#/shared/api' import { useShowDataStore } from '#/shared/lib/hooks' -import { getUserApi } from '../api' -import { useUserStore } from './use-user-store' export function useUser() { const { setUser, user, loaded, loading, setLoaded, setLoading, getUser } = useUserStore() @@ -1,68 +0,0 @@ -import { createAsyncThunk, createSlice } from '@reduxjs/toolkit' -import { createAction } from '@reduxjs/toolkit/src' -import axios, { AxiosResponse } from 'axios' - -import { loadingThunk, useAppSelector } from '#/app/store/store' -import { API_URL } from '#/shared/lib/constants' -import { UserDTO } from '../types' - -type UserState = { - status: loadingThunk - user: UserDTO | null -} - -const initialState: UserState = { - status: 'idle', - user: null, -} - -export const getAll = async (token: string | null | undefined): Promise => { - const { data } = await axios.get>(API_URL + '/auth/me', { - headers: { - Authorization: `Bearer ${token}`, - }, - validateStatus: (status) => status === 200, - }) - - return data -} - -export const getAllInfo = createAsyncThunk('user/getAllInfo', async (token: string | null | undefined) => { - return await getAll(token) -}) - -export const unfollowEmail = createAsyncThunk( - 'user/unfollowEmail', - async (token: string | null | undefined) => { - await axios.patch( - API_URL + '/auth/email-sub', - {}, - { headers: { Authorization: `Bearer ${token}` } } - ) - } -) - -export const userSlice = createSlice({ - name: 'userSlice', - initialState, - reducers: {}, - extraReducers: (builder) => { - builder.addCase(getAllInfo.fulfilled, (state, action) => { - state.status = 'succeeded' - state.user = action.payload - }) - builder.addCase(getAllInfo.pending, (state) => { - state.status = 'pending' - }) - builder.addCase(getAllInfo.rejected, (state) => { - state.status = 'failed' - }) - builder.addCase(unfollowEmail.fulfilled, ({ user }, action) => { - if (!user) return - user.is_subscribed_to_emails = !user.is_subscribed_to_emails - }) - }, -}) - -export const {} = userSlice.actions - @@ -1,3 +1,5 @@ +export type AccountType = 'regular' | 'business' | 'admin' + export interface UserDTO { uid: string first_name: string @@ -5,14 +5,14 @@ import { Dayjs } from 'dayjs' import { useRouter } from 'next/navigation' import { useSession } from 'next-auth/react' +import styles from '../invite-person-in-business/ui/invite-modal.module.scss' + import { useThemeStore } from '#/entities/theme/model/use-theme-store' import { ButtonGray, ButtonUI, Error, InputStyleDark, InputStyleLight, Loader, Modal } from '#/shared' import { accountApi } from '#/shared/api/account-endpoints' import { API_URL } from '#/shared/lib/constants' import { DateInput } from '#/shared/ui/date-input/date-input' -import styles from '../invite-person-in-business/ui/invite-modal.module.scss' - export const ApiKeyModal = ({ open, setOpen, @@ -1,6 +1,7 @@ -import { api } from '#/shared/api' import { AuthUserByCredentialsDTO } from '../types' +import { api } from '#/shared/api' + export function authUser({ username, password }: AuthUserByCredentialsDTO) { return api.post('/auth/login', { email: username, password }) } @@ -1,6 +1,7 @@ +import React, { useEffect } from 'react' + import { useParamsStore } from '#/app/store/use-params-store' import { InferenceParams } from '#/entities/model-entity' -import React, { useEffect } from 'react' interface BotParamsMap { params: InferenceParams[] @@ -1,12 +1,13 @@ import React from 'react' + import styles from './bot-params-map.module.scss' -import { SwitchFilter } from '#/features/switch-filter/' -import { InputFilter } from '#/features/input-filter/ui/input-filter' import { useChatBotParams } from '#/entities/model-entity' -import { CommonTooltip } from '#/shared/ui/tooltip' -import { RangeSlider } from '#/shared/ui/range-slider' +import { InputFilter } from '#/features/input-filter/ui/input-filter' +import { SwitchFilter } from '#/features/switch-filter/' import { CommonSelect } from '#/shared/ui/common-select' +import { RangeSlider } from '#/shared/ui/range-slider' +import { CommonTooltip } from '#/shared/ui/tooltip' interface BotParamsMap {} @@ -1,7 +1,8 @@ -import { api } from '#/shared/api' import { ResponseGetBusinessGroups } from '../model/types' import { AddBusinessGroupDTO, ChangeBusinessGroupDTO } from '../types' +import { api } from '#/shared/api' + export function getBusinessGroup(group_id: string) { return api.get(`/auth/business-groups/${group_id}/`) } @@ -1,11 +1,14 @@ +import { Dispatch, SetStateAction, useState } from 'react' import { useForm } from 'react-hook-form' + +import { addBusinessGroup } from '../api' import { AddBusinessGroupForm } from '../types' -import { makePrivateRequest } from '#/shared/api' -import { Dispatch, SetStateAction, useState } from 'react' + import { ResponseGetBusinessGroups } from './types' -import { useShowDataStore } from '#/shared/lib/hooks' + import { withPending } from '#/shared' -import { addBusinessGroup } from '../api' +import { makePrivateRequest } from '#/shared/api' +import { useShowDataStore } from '#/shared/lib/hooks' export function useAddBusinessGroupForm( setGroups: Dispatch>, @@ -1,16 +1,18 @@ -import { ResponseGetPersons } from '#/features/invite-person-in-business' -import { makePrivateRequest } from '#/shared/api' import { useState } from 'react' -import { getBusinessHostAccounts } from '../../business-host-data/api' -import { useShowDataStore } from '#/shared/lib/hooks' -import { ChangeBusinessGroupForm } from '#/features/business-group/types' import { UseFormSetValue } from 'react-hook-form' + +import { getBusinessHostAccounts } from '../../business-host-data/api' + import { addBusinessGroupUser, deleteBusinessGroupUser, getBusinessGroup, } from '#/features/business-group/api' +import { ChangeBusinessGroupForm } from '#/features/business-group/types' +import { ResponseGetPersons } from '#/features/invite-person-in-business' import { ResponseGetBusinessGroups } from '#/features/invite-person-in-business/model/types' +import { makePrivateRequest } from '#/shared/api' +import { useShowDataStore } from '#/shared/lib/hooks' export function useBusinessHostAccount( currentGroup: ResponseGetBusinessGroups, @@ -1,11 +1,14 @@ +import { Dispatch, SetStateAction, useState } from 'react' import { useForm } from 'react-hook-form' + +import { changeBusinessGroup } from '../api' import { ChangeBusinessGroupForm } from '../types' -import { makePrivateRequest } from '#/shared/api' -import { Dispatch, SetStateAction, useState } from 'react' + import { ResponseGetBusinessGroups } from './types' -import { useShowDataStore } from '#/shared/lib/hooks' + import { withPending } from '#/shared' -import { changeBusinessGroup } from '../api' +import { makePrivateRequest } from '#/shared/api' +import { useShowDataStore } from '#/shared/lib/hooks' export function useChangeBusinessGroupForm( current_group: ResponseGetBusinessGroups, @@ -1,13 +1,12 @@ import React, { FC } from 'react' -import { ResponseGetBusinessGroups } from '#/features/business-group/model/types' - -import { Loader } from '#/shared' +import { useAddBusinessGroupForm } from '../model' import styles from './add-business-group.module.scss' -import { useAddBusinessGroupForm } from '../model' -import { ADD_BUSINESS_GROUP, PlateTemplate, getModalById } from '#/features/modals' +import { ResponseGetBusinessGroups } from '#/features/business-group/model/types' +import { ADD_BUSINESS_GROUP, getModalById,PlateTemplate } from '#/features/modals' +import { Loader } from '#/shared' import { CommonButton } from '#/shared/ui/button' import { CommonInput } from '#/shared/ui/common-input' @@ -2,16 +2,16 @@ import React, { FC, useEffect, useState } from 'react' import { Box, TextField, Typography } from '@mui/material' import { useSession } from 'next-auth/react' +import { useBusinessHostAccount, useChangeBusinessGroupForm } from '../model' + +import styles from './add-business-group.module.scss' + import { ResponseGetBusinessGroups } from '#/features/business-group/model/types' import { ResponseGetPersons } from '#/features/invite-person-in-business' - +import { CHANGE_BUSINESS_GROUP, getModalById,PlateTemplate } from '#/features/modals' import { ButtonGray, ButtonUI, InputStyleDark, InputStyleLight, Loader, Modal, ModalProps } from '#/shared' - -import styles from './add-business-group.module.scss' -import { useBusinessHostAccount, useChangeBusinessGroupForm } from '../model' -import { CHANGE_BUSINESS_GROUP, PlateTemplate, getModalById } from '#/features/modals' -import { CommonInput } from '#/shared/ui/common-input' import { CommonButton } from '#/shared/ui/button' +import { CommonInput } from '#/shared/ui/common-input' interface ChangeBusinessGroupProps { company_uid?: string @@ -1,6 +1,6 @@ import { ResponseGetPersons } from '#/features/invite-person-in-business' -import { InfoBusiness } from '#/widgets/business-info' import { api } from '#/shared/api' +import { InfoBusiness } from '#/widgets/business-info' export const getBusinessHostAccounts = () => { return api.get('/auth/business-host/accounts?have_group=false') @@ -19,7 +19,7 @@ export function getBusinessInfo() { } export function downloadExpenses(from_date?: string, to_date?: string) { - return api.get(`/auth/business-host/download-expenses?type=employees`, { + return api.get('/auth/business-host/download-expenses?type=employees', { params: { from_date, to_date }, }) } @@ -1,4 +1,6 @@ -import { makePrivateRequest } from '#/shared/api' +import { useEffect, useState } from 'react' +import error from 'next/error' + import { downloadExpenses, getBusinessInfo, @@ -7,13 +9,13 @@ import { putMailingEmails, putMailingSettings, } from '../api' -import { useShowDataStore } from '#/shared/lib/hooks' -import { useEffect, useState } from 'react' -import error from 'next/error' import { useBusinessInfoStore } from '../model/business-info.store' import { useLoadingStore } from '../model/loading.store' import { usePersonsStore } from '../model/persons.store' +import { makePrivateRequest } from '#/shared/api' +import { useShowDataStore } from '#/shared/lib/hooks' + export const useBusinessHostData = () => { const { setSecurityList, setPersonsList, securityList, personsList } = usePersonsStore() @@ -106,6 +108,7 @@ export const useBusinessHostData = () => { personsList, info, mailing, + emails, isLoading, error, fetchData, @@ -113,7 +116,6 @@ export const useBusinessHostData = () => { downloadExpensesReport, updateMailingEmails, fetchSecurityPersons, - emails, setEmails, setPersonsList, setSecurityList, @@ -1,4 +1,4 @@ -import React, { Dispatch, SetStateAction, memo, useEffect, useState } from 'react' +import React, { Dispatch, memo, SetStateAction, useEffect, useState } from 'react' import { Box, Button, TextField, Typography } from '@mui/material' import businessStyles from '#/app/styles/business.module.scss' @@ -5,12 +5,12 @@ import { Dayjs } from 'dayjs' import { useRouter } from 'next/navigation' import { useSession } from 'next-auth/react' +import styles from './invite-modal.module.scss' + import { ButtonGray, ButtonUI, Error, Loader, Modal } from '#/shared' import { API_URL } from '#/shared/lib/constants' import { DateInput } from '#/shared/ui/date-input/date-input' -import styles from './invite-modal.module.scss' - export const DownloadModal = ({ open, setOpen }: { open: boolean; setOpen: React.Dispatch> }) => { const [endDate, setEndDate] = useState() const [startDate, setStartDate] = useState() @@ -3,9 +3,9 @@ import { Box, Tooltip } from '@mui/material' import Typography from '@mui/material/Typography' import Image from 'next/image' +import { useThemeStore } from '#/entities/theme/model/use-theme-store' import { useCalculating } from '#/features/calculation-tokens-gpt/model/use-calculating' import TooltipCalculating from '#/features/calculation-tokens-gpt/ui/tooltip-calculating' -import { useThemeStore } from '#/entities/theme/model/use-theme-store' import { baseColor } from '#/shared/lib/constants/colors' import { ImessageContext } from '#/shared/lib/types/types-gpt' import { TypeModelGPT } from '#/widgets/filters-gpt/lib/constants' @@ -2,8 +2,8 @@ import React from 'react' import { Box } from '@mui/material' import Typography from '@mui/material/Typography' -import { textTooltipCalculating } from '#/features/calculation-tokens-gpt/lib/constants' import { useThemeStore } from '#/entities/theme/model/use-theme-store' +import { textTooltipCalculating } from '#/features/calculation-tokens-gpt/lib/constants' const TooltipCalculating = ({ model = 'dalle' }: { model?: 'gpt' | 'dalle' | 'sd' }) => { const theme = useThemeStore((state) => state.theme) @@ -1,6 +1,7 @@ -import { api } from '#/shared/api' import { AllowedModels } from './types' +import { api } from '#/shared/api' + export function addAccess(title: string) { return api.put('/auth/business-host/allowed-models', { models: [title] }) } @@ -1,4 +1,5 @@ import React from 'react' + import { SwitchCustom } from '#/shared' type SwitchAccess = { @@ -1,6 +1,7 @@ +import { ChangeLimitDTO } from '../types' + import { ResponseGetPersons } from '#/features/business-group' import { api } from '#/shared/api' -import { ChangeLimitDTO } from '../types' export function putLimit({ email, ...dto }: Partial) { return api.put(`/auth/business-host/accounts/${email}`, dto) @@ -1,11 +1,13 @@ -import { ResponseGetPersons, InviteUserForm } from '#/features/invite-person-in-business' +import { useForm } from 'react-hook-form' + +import { putLimit } from '../api' +import { LimitModalForm, LimitModalListType } from '../types' + +import { InviteUserForm,ResponseGetPersons } from '#/features/invite-person-in-business' import { invitePerson } from '#/features/invite-person-in-business/api' import { withPending } from '#/shared' import { makePrivateRequest } from '#/shared/api' import { useShowDataStore } from '#/shared/lib/hooks' -import { useForm } from 'react-hook-form' -import { putLimit } from '../api' -import { LimitModalForm, LimitModalListType } from '../types' export function useLimitModalForm( list: ResponseGetPersons[], @@ -1,9 +1,10 @@ import { useMemo, useState } from 'react' -import { useShowDataStore } from '#/shared/lib/hooks' -import { makePrivateRequest } from '#/shared/api' + import { getBusinessGroups } from '#/features/business-group/api' -import { SelectItem } from '#/shared/ui/common-select' import { inviteRoles } from '#/features/business-group/lib/constants' +import { makePrivateRequest } from '#/shared/api' +import { useShowDataStore } from '#/shared/lib/hooks' +import { SelectItem } from '#/shared/ui/common-select' export function useLimitModal() { @@ -1,4 +1,4 @@ -import { ChangeLimitDTO } from "./limit-modal"; +import { ChangeLimitDTO } from './limit-modal'; export interface LimitModalForm extends Partial> {} \ No newline at end of file @@ -1,18 +1,18 @@ import React from 'react' import { Box, Typography } from '@mui/material' -import { ResponseGetPersons } from '#/features/invite-person-in-business' -import { Loader } from '#/shared' +import { inviteRolesSelect } from '../../invite-person-in-business/lib/constants' +import { useLimitModal, useLimitModalForm } from '../model' +import { InviteRole } from '../types' import styles from './limit-modal.module.scss' -import { inviteRolesSelect } from '../../invite-person-in-business/lib/constants' -import { InviteRole } from '../types' -import { useLimitModal, useLimitModalForm } from '../model' +import { ResponseGetPersons } from '#/features/invite-person-in-business' +import { getModalById,LIMIT_MODAL, PlateTemplate } from '#/features/modals' +import { Loader } from '#/shared' +import { CommonButton } from '#/shared/ui/button' import { CommonInput } from '#/shared/ui/common-input' import { CommonSelect } from '#/shared/ui/common-select' -import { CommonButton } from '#/shared/ui/button' -import { LIMIT_MODAL, PlateTemplate, getModalById } from '#/features/modals' interface LimitModalProps { person: ResponseGetPersons | null @@ -1,10 +1,12 @@ +import { useState } from 'react' +import { useForm } from 'react-hook-form' import { useSession } from 'next-auth/react' + import { changePassword } from '../api/change-password' -import { useState } from 'react' + import { getModalById, PLATE_CHANGE_PASSWORD } from '#/features/modals' -import { useShowDataStore } from '#/shared/lib/hooks/use-show-data' -import { useForm } from 'react-hook-form' import { makePrivateRequest } from '#/shared/api' +import { useShowDataStore } from '#/shared/lib/hooks/use-show-data' interface ChangePasswordForm { password: string @@ -1,10 +1,13 @@ -import '@testing-library/jest-dom' import { act, fireEvent, screen, waitFor } from '@testing-library/react' + +import '@testing-library/jest-dom' + +import { ChangePasswordPlate } from './change-password' + +import { getModalTest } from '#/../jest/utils/modal-tester' import { jestRender } from '#/../jest/utils/render' import { windowMock } from '#/../jest/utils/window-mock' -import { ChangePasswordPlate } from './change-password' import { PLATE_CHANGE_PASSWORD } from '#/features/modals' -import { getModalTest } from '#/../jest/utils/modal-tester' import { api } from '#/shared/api/instance' jest.mock('next/router') @@ -1,10 +1,12 @@ -import { getModalById, PLATE_CHANGE_PASSWORD, PlateTemplate } from '#/features/modals' +import { useChangePassword } from '../lib/use-change-password' + import styles from './change-password.module.scss' + +import ClosedEyeSvg from '#/assets/svg/closed-eye.svg?react' +import OpenedEyeSvg from '#/assets/svg/opened-eye.svg?react' +import { getModalById, PLATE_CHANGE_PASSWORD, PlateTemplate } from '#/features/modals' import { CommonButton } from '#/shared/ui/button' import { CommonInput } from '#/shared/ui/common-input' -import { useChangePassword } from '../lib/use-change-password' -import OpenedEyeSvg from '#/assets/svg/opened-eye.svg?react' -import ClosedEyeSvg from '#/assets/svg/closed-eye.svg?react' export const ChangePasswordPlate = () => { const modal = getModalById(PLATE_CHANGE_PASSWORD) @@ -1,9 +1,10 @@ +import { useMemo, useState } from 'react' + import { MessageSend } from '#/entities/message' import { Inference, useChatBotParams } from '#/entities/model-entity' import { acceptTypes } from '#/shared/common-load-file/config' import { useShowDataStore } from '#/shared/lib/hooks/use-show-data' -import { useMemo, useState } from 'react' export function useChatBotInput( inference: Inference | null, @@ -1,18 +1,20 @@ -import { getImagesBySlug, Message, useChatBotMessages } from '#/entities/message' -import { Device } from '#/shared/lib/types/entities' -import { getImagesGalery } from '#/widgets/messages' -import { useMediaQuery } from '@mui/material' -import { useSession } from 'next-auth/react' import { createRef, useEffect, useMemo, useRef, useState } from 'react' -import { LimitSize, Limit } from '../types' +import { useMediaQuery } from '@mui/material' import { useRouter } from 'next/router' -import { useShowDataStore } from '#/shared/lib/hooks/use-show-data' -import { useThemeAndDevice } from '#/shared/lib/hooks' +import { useSession } from 'next-auth/react' + +import { Limit,LimitSize } from '../types' + +import { getImagesBySlug, Message, useChatBotMessages } from '#/entities/message' import { getMessagesBySlug } from '#/entities/message' -import { makePrivateRequest } from '#/shared/api' import { useCurrentChat } from '#/features/chats' +import { makePrivateRequest } from '#/shared/api' +import { useThemeAndDevice } from '#/shared/lib/hooks' +import { useShowDataStore } from '#/shared/lib/hooks/use-show-data' +import { Device } from '#/shared/lib/types/entities' import { CommonScrollbarRef } from '#/shared/ui/scrollbar' +import { getImagesGalery } from '#/widgets/messages' export function useChatBotPagination() { const { currentChat } = useCurrentChat() @@ -1,4 +1,4 @@ -import { useState, useCallback } from 'react' +import { useCallback,useState } from 'react' export function useChatImageLoad( setFile: React.Dispatch> @@ -1,10 +1,12 @@ -import { PopupTemplate, PopupTemplateProps, getPopupById } from '#/shared/ui/popup' import React, { Dispatch, SetStateAction, useMemo } from 'react' +import { useMediaQuery } from 'usehooks-ts' + import styles from './chat-item-actions-popup.module.scss' + import Rename2Svg from '#/assets/svg/rename-2.svg?react' import TrashSvg from '#/assets/svg/trash.svg?react' import { useChatActions } from '#/entities/chat' -import { useMediaQuery } from 'usehooks-ts' +import { getPopupById,PopupTemplate, PopupTemplateProps } from '#/shared/ui/popup' export interface ChatItemActionsPopupProps extends PopupTemplateProps { id: string @@ -1,12 +1,13 @@ import React, { useState } from 'react' +import { title } from 'process' import styles from './chat-mobile-rename-popup.module.scss' -import { PopupTemplate, getPopupById } from '#/shared/ui/popup' -import { CommonInput } from '#/shared/ui/common-input' + import RenameSvg from '#/assets/svg/rename.svg?react' import { useChatActions } from '#/entities/chat' -import { title } from 'process' import { CommonButton } from '#/shared/ui/button' +import { CommonInput } from '#/shared/ui/common-input' +import { getPopupById,PopupTemplate } from '#/shared/ui/popup' interface ChatMobileRenameProps { id: string @@ -1,11 +1,13 @@ import React, { ChangeEvent } from 'react' +import { useRouter } from 'next/router' + import { sendReport } from '../api' + +import { useUserStore } from '#/entities/user-account' import { makePrivateRequest } from '#/shared/api' import { useShowDataStore } from '#/shared/lib/hooks/use-show-data' -import { useRouter } from 'next/router' -import { useUserStore } from '#/entities/user-account' const MAX_FILE_SIZE = 4.5 * 1024 * 1024 // 4.5 MB @@ -1,13 +1,17 @@ -import '@testing-library/jest-dom' import { act, fireEvent, screen, waitFor } from '@testing-library/react' +import axios from 'axios' + +import '@testing-library/jest-dom' + +import { sendReport } from '../api' + +import { ErrorReportPlate } from './error-report' + +import { getModalTest } from '#/../jest/utils/modal-tester' import { jestRender } from '#/../jest/utils/render' import { windowMock } from '#/../jest/utils/window-mock' import { ERROR_REPORT, PLATE_CHANGE_PASSWORD } from '#/features/modals' -import { getModalTest } from '#/../jest/utils/modal-tester' import { api } from '#/shared/api/instance' -import { ErrorReportPlate } from './error-report' -import axios from 'axios' -import { sendReport } from '../api' jest.mock('next/router') jest.mock('@sentry/nextjs') @@ -86,7 +90,7 @@ describe('error-report', () => { }) await waitFor(() => { - expect(showMessageMock).toHaveBeenCalledWith("Поле не должно быть пустым.") + expect(showMessageMock).toHaveBeenCalledWith('Поле не должно быть пустым.') }) }) }) @@ -1,13 +1,15 @@ import * as React from 'react' + +import { useErrorReport } from '../model/use-error-report' + +import styles from './error-report.module.scss' + import AttachSvg from '#/assets/svg/attach.svg?react' import PlusSvg from '#/assets/svg/plus.svg?react' import { ERROR_REPORT, getModalById, PlateTemplate } from '#/features/modals' - -import styles from './error-report.module.scss' import { c } from '#/shared' -import { CommonTextArea } from '#/shared/ui/common-textarea' import { CommonButton } from '#/shared/ui/button' -import { useErrorReport } from '../model/use-error-report' +import { CommonTextArea } from '#/shared/ui/common-textarea' export const ErrorReportPlate = () => { const modal = getModalById(ERROR_REPORT) @@ -3,16 +3,14 @@ import { KeyboardArrowLeft, KeyboardArrowRight } from '@mui/icons-material' import { Box, Button, MobileStepper, Table, TableBody, TableCell, TableHead, TableRow, Typography } from '@mui/material' import CircularProgress from '@mui/material/CircularProgress' +import { IStatsProps } from '../model/types' +import { useGetStats } from '../model/use-get-stats/use-get-stats' import { TranslateFields } from '#/features/get-admin-stats/lib/constants' - import { TypographyDark, TypographyLight } from '#/shared/lib/constants/styles' -import { IStatsProps } from '../model/types' -import { useGetStats } from '../model/use-get-stats/use-get-stats' - export const Stats: React.FC = ({ token, device, product, group_by, start_date, end_date, theme }) => { - const [stats, loading] = useGetStats(token, start_date, end_date, group_by, product) + const [stats, loading] = useGetStats(start_date, end_date, group_by, product) const [activeStep, setActiveStep] = React.useState(0) @@ -1,5 +1,6 @@ import { useState } from 'react' + import { useParamsStore } from '#/app/store/use-params-store' export function useImagesBotFilters() { @@ -1,7 +1,8 @@ +import { useMemo, useState } from 'react' + import { MessageSend } from '#/entities/message' import { Inference, useImageBotParams } from '#/entities/model-entity' import { useShowDataStore } from '#/shared/lib/hooks' -import { useMemo, useState } from 'react' export function useImageBotInput(sendMessage: (data: MessageSend) => Promise) { const { showMessage } = useShowDataStore() @@ -1,14 +1,16 @@ -import { getImagesBySlug, Message, useImageBotMessages } from '#/entities/message' -import { Device } from '#/shared/lib/types/entities' -import { getImagesGalery } from '#/widgets/messages' -import { useMediaQuery } from '@mui/material' -import { useSession } from 'next-auth/react' import { useEffect, useRef, useState } from 'react' -import { LimitSize, Limit } from '../types' +import { useMediaQuery } from '@mui/material' import { useRouter } from 'next/router' -import { useShowDataStore } from '#/shared/lib/hooks/use-show-data' +import { useSession } from 'next-auth/react' + +import { Limit,LimitSize } from '../types' + +import { getImagesBySlug, Message, useImageBotMessages } from '#/entities/message' import { useImageObjectId } from '#/features/image-object-id' import { makePrivateRequest } from '#/shared/api' +import { useShowDataStore } from '#/shared/lib/hooks/use-show-data' +import { Device } from '#/shared/lib/types/entities' +import { getImagesGalery } from '#/widgets/messages' export function useImageBotPagination(deviceType: Device) { const refScrollMobile = useRef(null) @@ -1,12 +1,13 @@ import React from 'react' + import styles from './image-bot-params-map.module.scss' -import { SwitchFilter } from '#/features/switch-filter/' -import { InputFilter } from '#/features/input-filter/ui/input-filter' import { useChatBotParams, useImageBotParams } from '#/entities/model-entity' -import { CommonTooltip } from '#/shared/ui/tooltip' -import { RangeSlider } from '#/shared/ui/range-slider' +import { InputFilter } from '#/features/input-filter/ui/input-filter' +import { SwitchFilter } from '#/features/switch-filter/' import { CommonSelect } from '#/shared/ui/common-select' +import { RangeSlider } from '#/shared/ui/range-slider' +import { CommonTooltip } from '#/shared/ui/tooltip' interface ImageBotParamsMap {} @@ -1,5 +1,7 @@ import { Dispatch, SetStateAction, useEffect, useMemo, useState } from 'react' + import { ImageWithState } from './types' + import { Message } from '#/entities/message' import { GALLERY_IMAGES, getModalById } from '#/features/modals' @@ -1,6 +1,7 @@ -import { debounce } from 'lodash' import { useCallback, useEffect, useState } from 'react' +import { debounce } from 'lodash' import { Swiper as SwiperCore } from 'swiper' + import { ImageWithState } from './types' export const useLibrarySwiper = (onSlideFalse: ((...args: any) => any) | undefined, reverse: boolean) => { @@ -1,19 +1,21 @@ import React, { Dispatch, SetStateAction, useEffect, useMemo, useRef, useState } from 'react' +import { CSSTransition } from 'react-transition-group' +import { ArrowDropDown } from '@mui/icons-material' +import { Typography } from '@mui/material' import Image from 'next/image' +import { Swiper, SwiperSlide } from 'swiper/react' -import styles from './modal-styles.module.scss' -import { ArrowDropDown } from '@mui/icons-material' -import { c, Loader, TooltipCustom } from '#/shared' import { useImagesLibrary } from '../model' - -import { Swiper, SwiperSlide } from 'swiper/react' -import 'swiper/css' import { useLibrarySwiper } from '../model/use-swiper' -import { Typography } from '@mui/material' + import { ModalImage } from './modal-image' + +import 'swiper/css' +import styles from './modal-styles.module.scss' + import { Message, useImageIcons } from '#/entities/message' import { GALLERY_IMAGES, getModalById, PlateTemplate } from '#/features/modals' -import { CSSTransition } from 'react-transition-group' +import { c, Loader, TooltipCustom } from '#/shared' interface IProps { onSlideFalse?: (...args: any) => any @@ -1,10 +1,11 @@ -import { Message } from '#/entities/message' -import { Loader } from '#/shared' -import Image from 'next/image' import React, { useEffect } from 'react' +import Image from 'next/image' import styles from './modal-image.module.scss' +import { Message } from '#/entities/message' +import { Loader } from '#/shared' + interface ModalImageProps extends Message {} export const ModalImage = ({ file, ...image }: ModalImageProps) => { @@ -1,7 +1,8 @@ import React, { useEffect, useMemo, useRef, useState } from 'react' + import { useChatBot } from '#/entities/model-entity' -import { CommonSelect, SelectItem } from '#/shared/ui/common-select' import { useImageBot } from '#/entities/model-entity/model/use-image-bot' +import { CommonSelect, SelectItem } from '#/shared/ui/common-select' interface ImageModelParamsSelectProps {} @@ -1,8 +1,10 @@ import React from 'react' -import { CommonTextArea } from '#/shared/ui/common-textarea' -import { CommonTooltip } from '#/shared/ui/tooltip' + import styles from './input-filter.module.scss' + import { isNumericString } from '#/shared' +import { CommonTextArea } from '#/shared/ui/common-textarea' +import { CommonTooltip } from '#/shared/ui/tooltip' interface InputFilterProps { title: string @@ -1,8 +1,9 @@ import { inviteRoles } from '../lib/constants' import { ResponseGetPersons } from '../model/types' -import { api } from '#/shared/api' import { InvitePersonDTO } from '../types' +import { api } from '#/shared/api' + export function invitePerson({ ...dto }: InvitePersonDTO) { return api.post('/auth/business-host', dto) } @@ -1,9 +1,12 @@ import { useMemo, useState } from 'react' + import { inviteRoles } from '../lib/constants' + import { ResponseGetBusinessGroups } from './types' -import { useShowDataStore } from '#/shared/lib/hooks' -import { makePrivateRequest } from '#/shared/api' + import { getBusinessGroups } from '#/features/business-group/api' +import { makePrivateRequest } from '#/shared/api' +import { useShowDataStore } from '#/shared/lib/hooks' import { SelectItem } from '#/shared/ui/common-select' export function useInviteModal() { @@ -1,11 +1,14 @@ +import { Dispatch, SetStateAction, useState } from 'react' import { useForm } from 'react-hook-form' + +import { invitePerson } from '../api' import { InviteUserForm } from '../types' -import { makePrivateRequest } from '#/shared/api' -import { Dispatch, SetStateAction, useState } from 'react' + import { ResponseGetBusinessGroups, ResponseGetPersons } from './types' -import { useShowDataStore } from '#/shared/lib/hooks' + import { withPending } from '#/shared' -import { invitePerson } from '../api' +import { makePrivateRequest } from '#/shared/api' +import { useShowDataStore } from '#/shared/lib/hooks' export function useInviteUserForm(showNewPersons: (persons: ResponseGetPersons) => void, onClose?: Function) { const { @@ -1,4 +1,4 @@ -import { InvitePersonDTO } from "./invite-person"; +import { InvitePersonDTO } from './invite-person'; export interface InviteUserForm extends InvitePersonDTO {} @@ -1,15 +1,17 @@ import React, { FC, useEffect, useState } from 'react' -import { Loader } from '#/shared' + +import { useInviteModal, useInviteUserForm } from '../model' import { ResponseGetPersons } from '../model/types' +import { InviteRole } from '../types' import styles from './invite-modal.module.scss' -import { useInviteModal, useInviteUserForm } from '../model' -import { CommonButton } from '#/shared/ui/button' + +import { getModalById,INVITE_USER, PlateTemplate } from '#/features/modals' +import { Loader } from '#/shared' import { getEmailOptions } from '#/shared/lib/constants/hook-form-options' +import { CommonButton } from '#/shared/ui/button' import { CommonInput } from '#/shared/ui/common-input' import { CommonSelect } from '#/shared/ui/common-select' -import { InviteRole } from '../types' -import { INVITE_USER, PlateTemplate, getModalById } from '#/features/modals' interface InviteModalProps { showNewPersons: (persons: ResponseGetPersons) => void @@ -1,15 +1,17 @@ import React, { FC, useEffect, useState } from 'react' -import { Loader } from '#/shared' + +import { useInviteModal, useInviteUserForm } from '../model' import { ResponseGetPersons } from '../model/types' +import { InviteRole } from '../types' import styles from './invite-security-modal.module.scss' -import { useInviteModal, useInviteUserForm } from '../model' -import { CommonButton } from '#/shared/ui/button' + +import { getModalById,INVITE_SECURITY_MODAL, INVITE_USER, PlateTemplate } from '#/features/modals' +import { Loader } from '#/shared' import { getEmailOptions } from '#/shared/lib/constants/hook-form-options' +import { CommonButton } from '#/shared/ui/button' import { CommonInput } from '#/shared/ui/common-input' import { CommonSelect } from '#/shared/ui/common-select' -import { InviteRole } from '../types' -import { INVITE_SECURITY_MODAL, INVITE_USER, PlateTemplate, getModalById } from '#/features/modals' interface InviteModalProps { showNewPersons: (persons: ResponseGetPersons) => void @@ -1 +1 @@ -export { default as PlateTemplate } from "./template"; \ No newline at end of file +export { default as PlateTemplate } from './template'; \ No newline at end of file @@ -1,9 +1,11 @@ import { useEffect } from 'react' -import { c } from '#/shared' + import { usePlatesStore } from '../model' + import styles from './template.module.scss' import PlusIcon from '#/assets/svg/plus.svg?react' +import { c } from '#/shared' import { useThemeAndDevice } from '#/shared/lib/hooks' export type AlignX = 'left' | 'center' | 'right' @@ -1,4 +1,4 @@ -import { create } from "zustand"; +import { create } from 'zustand'; export interface ModelInputStore { modelInputValue: string; @@ -17,7 +17,7 @@ export const useModelInputStore = create((set, get) => { return { modelInputFile: null, - modelInputValue: "", + modelInputValue: '', setModelInputValue, setModelInputFile }; @@ -1,7 +1,8 @@ -import { getDeviceType } from '#/shared' import { FormEventHandler, KeyboardEventHandler, useEffect, useRef, useState } from 'react' import { useMediaQuery } from 'usehooks-ts' +import { getDeviceType } from '#/shared' + export function useModelInput( value: string, setValue: (value: string) => void, @@ -1,8 +1,11 @@ -import '@testing-library/jest-dom' import { act, fireEvent, screen, waitFor } from '@testing-library/react' + +import '@testing-library/jest-dom' + +import { ModelInput } from './model-input' + import { jestRender } from '#/../jest/utils/render' import { windowMock } from '#/../jest/utils/window-mock' -import { ModelInput } from './model-input' jest.mock('next/router') jest.mock('@sentry/nextjs') @@ -1,14 +1,15 @@ import React, { useEffect } from 'react' -import { ModelInputs } from '#/shared/api/models/models' +import { useModelInput } from '../model' import classes from './model-input.module.scss' -import { useChatBotMessages } from '#/entities/message' + import InputSettingsSvg from '#/assets/svg/input-setting.svg?react' -import { CommonTextArea } from '#/shared/ui/common-textarea' -import { useModelInput } from '../model' -import { CommonSendButton } from '#/shared/ui/common-send-button' +import { useChatBotMessages } from '#/entities/message' +import { ModelInputs } from '#/shared/api/models/models' import { CommonLoadFile } from '#/shared/common-load-file' +import { CommonSendButton } from '#/shared/ui/common-send-button' +import { CommonTextArea } from '#/shared/ui/common-textarea' export interface ModelInputProps { value: string @@ -1,4 +1,5 @@ import React, { useEffect, useMemo, useRef, useState } from 'react' + import { useChatBot } from '#/entities/model-entity' import { CommonSelect, SelectItem } from '#/shared/ui/common-select' @@ -1,5 +1,7 @@ import axios from 'axios' +import { DataForCreate, DataForCreateBusiness } from './types' + import { FieldActivity, FieldActivitySelect, @@ -8,10 +10,6 @@ import { } from '#/features/register-business/lib/constants-step-information' import { API_URL } from '#/shared/lib/constants' - - -import { DataForCreateBusiness } from './types' - export const createAccount = async (information: DataForCreate, token: string | null) => { const indexOfS = Object.values(FrequencySelect).indexOf(information.frequency as unknown as FrequencySelect) @@ -1,5 +1,18 @@ import { FieldActivity, Frequency } from '../../lib/constants-step-information' +export type DataForCreate = { + companyName: string + fieldActivity: string + inn: string + email: string + phone: string + ogrn: string + numberStuff: number + name: string + frequency: string + job_title: string +} + export type DataForCreateBusiness = { company_sector: FieldActivity planned_amount_of_workers: number @@ -4,18 +4,16 @@ import { FormProvider, useForm } from 'react-hook-form' import { SubmitErrorHandler } from 'react-hook-form/dist/types/form' import { Box, TextField, Typography } from '@mui/material' -import { FieldActivity, FieldActivitySelect, Frequency, FrequencySelect } from '#/features/register-business/lib/constants-step-information' -import { IEmailForms } from '#/features/register-by-email/model/types' +import styles from './step-information.module.scss' + import { useThemeStore } from '#/entities/theme/model/use-theme-store' +import { FieldActivity, FieldActivitySelect, Frequency, FrequencySelect } from '#/features/register-business/lib/constants-step-information' import { useStepperStore } from '#/features/register-business/model/use-stepper-store' +import { IEmailForms } from '#/features/register-by-email/model/types' import { ButtonUI, InputStyleDark, InputStyleLight } from '#/shared' import { Error } from '#/shared' -import { SelectUI } from '#/shared/ui/select' - - - -import styles from './step-information.module.scss' import { useShowDataStore } from '#/shared/lib/hooks/use-show-data' +import { SelectUI } from '#/shared/ui/select' export const StepInformation = () => { const { dataForCreate, setDataForCreate, switchNextStep } = useStepperStore((state) => ({ dataForCreate: state.dataForCreate, @@ -3,21 +3,22 @@ import { useForm } from 'react-hook-form' import { SubmitErrorHandler } from 'react-hook-form/dist/types/form' import { Autocomplete, Box, TextField, Typography } from '@mui/material' -import { CompanyData } from '#/features/register-business/api/get-company-date/types' -import { useCheckTypeCompany } from '#/features/register-business/model/legal-info/use-check-type-company' -import styles from '#/features/register-business/ui/step-information/step-information.module.scss' -import { IEmailForms } from '#/features/register-by-email/model/types' -import { useThemeStore } from '#/entities/theme/model/use-theme-store' -import { useStepperStore } from '#/features/register-business/model/use-stepper-store' -import { ButtonUI, Error, InputStyleDark, InputStyleLight } from '#/shared' -import { useShowDataStore } from '#/shared/lib/hooks/use-show-data' - import { companyNameOptions, innOptions, ogrnOptions, } from '../../lib/constatnts-step-legal-informative' import { useAutoSetInfo } from '../../model/legal-info/use-auto-set-info' + +import styles from '#/features/register-business/ui/step-information/step-information.module.scss' + +import { useThemeStore } from '#/entities/theme/model/use-theme-store' +import { CompanyData } from '#/features/register-business/api/get-company-date/types' +import { useCheckTypeCompany } from '#/features/register-business/model/legal-info/use-check-type-company' +import { useStepperStore } from '#/features/register-business/model/use-stepper-store' +import { IEmailForms } from '#/features/register-by-email/model/types' +import { ButtonUI, Error, InputStyleDark, InputStyleLight } from '#/shared' +import { useShowDataStore } from '#/shared/lib/hooks/use-show-data' export const StepLegalInformative = () => { const theme = useThemeStore((state) => state.theme) const { @@ -5,15 +5,14 @@ import StepperMui from '@mui/material/Stepper' import Image from 'next/image' import { useRouter } from 'next/router' -import { useStepperStore } from '#/features/register-business/model/use-stepper-store' - import { steps } from '../../lib/constants' - import { StepContact } from '../step-contact/step-contact' import { StepInformation } from '../step-information/step-information' import { StepLegalInformative } from '../step-legal-informative/step-legal-informative' import styles from './stepper.module.scss' + +import { useStepperStore } from '#/features/register-business/model/use-stepper-store' import { useShowDataStore } from '#/shared/lib/hooks/use-show-data' export const Stepper = () => { const { @@ -10,17 +10,16 @@ import axios from 'axios' import Link from 'next/link' import { useRouter } from 'next/router' +import ClosedEyeSvg from '#/assets/svg/closed-eye.svg?react' +import OpenedEyeSvg from '#/assets/svg/opened-eye.svg?react' import { PasswordOptions } from '#/features/register-by-email/lib/constants' import { IEmailForms } from '#/features/register-by-email/model/types' - import { emailOptions } from '#/shared' import { CheckBoxAgreeWithRules } from '#/shared' import { Error } from '#/shared' import { InputStyleDark, InputStyleLight } from '#/shared' import { API_URL } from '#/shared/lib/constants/constants' import { useThemeAndDevice } from '#/shared/lib/hooks' -import OpenedEyeSvg from '#/assets/svg/opened-eye.svg?react' -import ClosedEyeSvg from '#/assets/svg/closed-eye.svg?react' import { useShowDataStore } from '#/shared/lib/hooks/use-show-data' interface IRegisterEmailFormProps { @@ -1,8 +1,9 @@ import axios from 'axios' + import { API_URL } from '#/shared/lib/constants' export const removePerson = async (person_uid?: string, token?: string) => { - return await axios.delete(API_URL + `/auth/business-host`, { + return await axios.delete(API_URL + '/auth/business-host', { data: { uid: person_uid, }, @@ -1,9 +1,9 @@ -import { Dispatch, SetStateAction, useState, useEffect } from 'react' +import { Dispatch, SetStateAction, useEffect,useState } from 'react' import { useSession } from 'next-auth/react' -import { ResponseGetPersons } from '#/features/invite-person-in-business' - import { removePerson } from '../api/remove' + +import { ResponseGetPersons } from '#/features/invite-person-in-business' import { useShowDataStore } from '#/shared/lib/hooks/use-show-data' export const useRemove = ( @@ -1,10 +1,10 @@ import { Box, Typography } from '@mui/material' import Image from 'next/image' +import { useRemove } from '../../model/remove' + import { ResponseGetPersons } from '#/features/invite-person-in-business' import { ButtonGray, ButtonUI, Modal } from '#/shared' - -import { useRemove } from '../../model/remove' export const XMark = ({ person, setNewPersons, @@ -1,6 +1,7 @@ -import { API_URL } from '#/shared/lib/constants' import axios from 'axios' +import { API_URL } from '#/shared/lib/constants' + export const resendInvation = async (email: string, token?: string) => { return await axios.post( API_URL + `/auth/business-host/re-invite/${email}`, @@ -1,5 +1,7 @@ import { useSession } from 'next-auth/react' + import { resendInvation } from '../api/resend-invation' + import { getModalById, RESEND_INVATION_PASSWORD } from '#/features/modals' import { useShowDataStore } from '#/shared/lib/hooks/use-show-data' @@ -1,10 +1,13 @@ -import { getModalById, RESEND_INVATION_PASSWORD, PlateTemplate } from '#/features/modals' -import styles from './resend-invation.module.scss' import React from 'react' -import { CommonButton } from '#/shared/ui/button' -import { CommonInput } from '#/shared/ui/common-input' + import { useResendInvation } from '../lib/use-resend-invation' + +import styles from './resend-invation.module.scss' + +import { getModalById, PlateTemplate,RESEND_INVATION_PASSWORD } from '#/features/modals' import { useShowDataStore } from '#/shared/lib/hooks/use-show-data' +import { CommonButton } from '#/shared/ui/button' +import { CommonInput } from '#/shared/ui/common-input' interface ResendInvationPlateProps {} @@ -1,8 +1,10 @@ import React from 'react' + import styles from './reset-bot-filters.module.scss' -import { c } from '#/shared' -import { POPUP_CHAT_BOT_PARAMS, getPopupById } from '#/shared/ui/popup' + import { useChatBot } from '#/entities/model-entity' +import { c } from '#/shared' +import { getPopupById,POPUP_CHAT_BOT_PARAMS } from '#/shared/ui/popup' interface ResetBotFilters {} @@ -1,9 +1,11 @@ import React from 'react' + import styles from './reset-image-bot-filters.module.scss' -import { c } from '#/shared' -import { POPUP_CHAT_BOT_PARAMS, POPUP_IMAGE_BOT_PARAMS, getPopupById } from '#/shared/ui/popup' + import { useChatBot } from '#/entities/model-entity' import { useImageBot } from '#/entities/model-entity/model/use-image-bot' +import { c } from '#/shared' +import { getPopupById,POPUP_CHAT_BOT_PARAMS, POPUP_IMAGE_BOT_PARAMS } from '#/shared/ui/popup' interface ResetImageBotFilters {} @@ -5,7 +5,7 @@ export function useLoadingLogs() { const { data } = useSession() function onMounted() { - if (!data) return captureMessage(`long time loading - session not defined`) + if (!data) return captureMessage('long time loading - session not defined') const { user } = data @@ -1,10 +1,13 @@ import React, { useEffect } from 'react' +import { captureMessage } from '@sentry/nextjs' +import { signOut, useSession } from 'next-auth/react' + +import { useLoadingLogs } from '../model' + import styles from './slow-loading.module.scss' + import { Loader } from '#/shared' import { CommonButton } from '#/shared/ui/button' -import { signOut, useSession } from 'next-auth/react' -import { captureMessage } from '@sentry/nextjs' -import { useLoadingLogs } from '../model' interface SlowLoadingProps {} @@ -1,7 +1,9 @@ import React from 'react' -import { CommonTooltip } from '#/shared/ui/tooltip' + import styles from './switch-filter.module.scss' +import { CommonTooltip } from '#/shared/ui/tooltip' + interface SwitchFilterProps { name: string value: boolean @@ -1,5 +1,10 @@ -import { getUserBalance } from '#/entities/balance' +import { useEffect } from 'react' +import { EventSourcePolyfill } from 'event-source-polyfill' +import { cloneDeep } from 'lodash' +import { useSession } from 'next-auth/react' + +import { getBalance } from '#/entities/balance' import { Message, MessageEventStreamResponse, @@ -15,10 +20,6 @@ import { useCurrentChat } from '#/features/chats' import { makePrivateRequest } from '#/shared/api' import { useEventSource } from '#/shared/lib/event-source' import { useShowDataStore } from '#/shared/lib/hooks/use-show-data' -import { EventSourcePolyfill } from 'event-source-polyfill' -import { cloneDeep } from 'lodash' -import { useSession } from 'next-auth/react' -import { useEffect } from 'react' export function useChatMessageActions() { @@ -106,8 +107,6 @@ export function useChatMessageActions() { makeEvent('chat-bot', () => { ;(result as Message[])[1].content = '' }) - - // TODO: Add getUserBalance to Zustand store }) const deleteMessage = makePrivateRequest(async (uid: string) => { @@ -0,0 +1,11 @@ +import { Template } from '#/domains/copywrite/proxy/types/template' +import { Message } from '#/entities/message' +import { api } from '#/shared/api' + +export function getTemplates() { + return api.get('/copy/templates') +} + +export function getGeneration() { + return api.get('/copy/generation') +} \ No newline at end of file @@ -0,0 +1 @@ +export * from './copy.routes' \ No newline at end of file @@ -0,0 +1 @@ +export * from './use-copy-store' \ No newline at end of file @@ -0,0 +1,40 @@ +import { create } from 'zustand' + +import { getGeneration,getTemplates } from '../api/copy.routes' + +import { Template } from '#/domains/copywrite/proxy/types/template' +import { Message } from '#/entities/message' + +export interface CopyStore { + templates: Template[] | null + generation: Message[] | null + loadTemplates: () => Promise + loadGeneration: () => Promise +} + +export const useCopyStore = create((set, get) => { + async function loadTemplates() { + try { + const response = await getTemplates() + set({ templates: response.data }) + } catch (error) { + console.error('Error loading templates:', error) + } + } + + async function loadGeneration() { + try { + const response = await getGeneration() + set({ generation: response.data }) + } catch (error) { + console.error('Error loading generation:', error) + } + } + + return { + templates: null, + generation: null, + loadTemplates, + loadGeneration, + } +}) @@ -0,0 +1,3 @@ +export * from './api' +export * from './model' +export * from './use-copy' \ No newline at end of file @@ -4,8 +4,8 @@ import { useSession } from 'next-auth/react' import { emptyTemplate } from '#/domains/copywrite/lib/constants' import { Template } from '#/domains/copywrite/proxy/types/template' -import { useCopyStore } from '#/features/use-copy/model/use-copy-store' import { Message } from '#/entities/message' +import { useCopyStore } from '#/features/use-copy/model/use-copy-store' interface UseCopy { currentTemplate: Template | null @@ -49,8 +49,8 @@ export const useCopy = (): UseCopy => { useEffect(() => { if (data?.access) { - loadTemplates(data.access) - loadGeneration(data.access) + loadTemplates() + loadGeneration() } }, [data?.access, loadTemplates, loadGeneration]) @@ -8,7 +8,10 @@ import { Error } from '#/shared/lib/types/entities' type ResponseStats = { source: string; amount: string }[] -let dataLine = data +let dataLine = { + ...data, + labels: [], +} let dataForAround = { labels: [], @@ -92,7 +95,17 @@ export const useStats = () => { async function setStats(type: string) { const { data: res, status } = await getStatistic(type, timeForStats, session?.access) - if (status != 200) return + if (status != 200) { + // Устанавливаем пустые данные при ошибке + if (type === 'days') { + setStatsByDays({ ...dataLine, labels: [] }) + } else if (type === 'models') { + setStatsByModels({ ...dataForAround, labels: [] }) + } else if (type === 'categories') { + setStatsByType({ ...dataForAround, labels: [] }) + } + return + } const spends = res.map((el) => el.amount).filter((el) => +el) @@ -115,6 +128,16 @@ export const useStats = () => { return } + // Проверяем, есть ли данные для круговых диаграмм + if (spends.length === 0) { + if (type === 'models') { + setStatsByModels({ ...dataForAround, labels: [] }) + } else if (type === 'categories') { + setStatsByType({ ...dataForAround, labels: [] }) + } + return + } + dataForAround = { ...dataForAround, labels: (res as never[]).filter((el: any) => +el.amount), @@ -1,10 +1,11 @@ -import { PopupTemplate, PoputTemplateHorizontal, getPopupById } from '#/shared/ui/popup' import React from 'react' -import CopySvg from '#/assets/svg/copy.svg?react' -import TrashSvg from '#/assets/svg/trash.svg?react' import styles from './user-message-popup.module.scss' + +import CopySvg from '#/assets/svg/copy.svg?react' +import TrashSvg from '#/assets/svg/trash.svg?react' import { useChatMessageActions } from '#/features/use-chat-message-actions' +import { getPopupById,PopupTemplate, PoputTemplateHorizontal } from '#/shared/ui/popup' interface UserMessageActionsPopupProps { id: string @@ -1,9 +1,9 @@ -import theme from '#/entities/theme/model/theme' -import { useThemeAndDevice } from '#/shared/lib/hooks' +import React, { useState } from 'react' import { Button } from '@mui/material' -import { signIn } from 'next-auth/react' import Image from 'next/image' -import React, { useState } from 'react' +import { signIn } from 'next-auth/react' + +import { useThemeAndDevice } from '#/shared/lib/hooks' interface YandexAuthButtonProps {} @@ -1,5 +1,5 @@ -import { BusinessHost } from "#/views/account"; -import { getAdminLayout } from "#/widgets/layouts"; +import { BusinessHost } from '#/views/account'; +import { getAdminLayout } from '#/widgets/layouts'; BusinessHost.getLayout = getAdminLayout({title: 'Корпоративный аккаунт'}) @@ -1,10 +1,11 @@ -import { getUserServer } from '#/entities/user-account/api' -import { authUser, authUserByYandex, refresh } from '#/features/auth' import NextAuth, { User } from 'next-auth' import { JWT } from 'next-auth/jwt' import CredentialsProvider from 'next-auth/providers/credentials' import YandexProvider from 'next-auth/providers/yandex' +import { getUserServer } from '#/entities/user-account/api' +import { authUser, authUserByYandex, refresh } from '#/features/auth' + const handler = NextAuth({ secret: process.env.NEXTAUTH_SECRET, providers: [ @@ -31,7 +31,7 @@ export const ERROR_MAPPING: Record = { } export const ERROR_YANDEX_MAPPING: Record = { - "Your credentials aren't allowed": 'yandex_credentials_not_allowed', + 'Your credentials aren\'t allowed': 'yandex_credentials_not_allowed', 'Invalid client_id parameter value.': 'yandex_client_id_not_correct', } @@ -1,13 +1,13 @@ +import * as Sentry from '@sentry/browser' import axios, { AxiosResponse } from 'axios' import { User } from 'next-auth' import { JWT } from 'next-auth/jwt' -import * as Sentry from '@sentry/browser' - -import { getAll } from '#/entities/user-account/model/user-type-slice' -import { API_URL } from '#/shared/lib/constants' import { AuthConstants } from './constants' +// Функция getAll перенесена в Zustand store useUserReferralStore +import { API_URL } from '#/shared/lib/constants' + type ExchangeReturn = { access: string; refresh: string } type DataForLogin = { username: string; password: string } @@ -1,6 +1,7 @@ -import { PopupBackdrop } from '#/shared/ui/popup' import { Head, Html, Main, NextScript } from 'next/document' +import { PopupBackdrop } from '#/shared/ui/popup' + export default function Document() { return ( @@ -6,12 +6,11 @@ import { useSession } from 'next-auth/react' import process from 'process' import { getUserBalance } from '#/entities/balance' - +import { Message, MessageSend } from '#/entities/message' import { API_URL } from '#/shared/lib/constants' +import { Variant } from '#/shared/lib/hooks/use-show-data' import { Device } from '#/shared/lib/types/entities' import { IMessageRequest } from '#/shared/lib/types/types-gpt' -import { Message, MessageSend } from '#/entities/message' -import { Variant } from '#/shared/lib/hooks/use-show-data' const formDataHelper = (file: File, dataForSend: MessageSend): FormData => { const FD = new FormData() @@ -3,12 +3,11 @@ import { Session } from 'next-auth' import * as process from 'process' import { ChatDTO } from '#/entities/chat/types/chat.dto' +import { Message } from '#/entities/message' import { Error } from '#/shared/lib/types/entities' import { IImagesResponse } from '#/shared/lib/types/types-dalle' import { IMessageRequest, ISendMessageResponse } from '#/shared/lib/types/types-gpt' -import { Message } from '#/entities/message' - const API_URL = process.env.NEXT_PUBLIC_API_HOST type Result = { @@ -1,8 +1,9 @@ -import { getSession, signOut, useSession } from 'next-auth/react' +import { useCallback } from 'react' +import axios, { InternalAxiosRequestConfig } from 'axios' import { useRouter } from 'next/navigation' +import { getSession, signOut, useSession } from 'next-auth/react' + import { api } from './instance' -import axios, { InternalAxiosRequestConfig } from 'axios' -import { useCallback } from 'react' export function makePrivateRequest( callback: (...params: Params) => Promise @@ -1,7 +1,9 @@ import React, { useMemo, useRef } from 'react' + import { acceptTypes } from '../config' -import PinnedFileSvg from '#/assets/svg/pinned-file.svg?react' + import AttachFileSvg from '#/assets/svg/attach-file.svg?react' +import PinnedFileSvg from '#/assets/svg/pinned-file.svg?react' interface CommonLoadFileProps { loading: boolean @@ -45,7 +47,7 @@ export const CommonLoadFile = ({ style={{ stroke: 'var(--new-ui-main-color)' }} onClick={() => (ref.current! as any).click()} > - + )} @@ -13,7 +13,7 @@ export enum ModelPagesList { export const API_URL = process.env.NEXT_PUBLIC_API_HOST export const surpriseMePrompts = [ - "Vintage 90's anime style. stylish model posing in 7/11 convenience store., sci-fi.", + 'Vintage 90\'s anime style. stylish model posing in 7/11 convenience store., sci-fi.', 'an exhausted pepe the frog at the frontlines in the army at night with his platoon fighting, key lighting, soft lights, foggy, by steve hanks, by lisa yuskavage, by serov valentin, by tarkovsky, 8 k render, detailed, cute cartoon style, very cute adorable face', @@ -29,7 +29,7 @@ export const surpriseMePrompts = [ '8k render of a glowing reflective iridescent male marble bust, glowing, dark hues, 8k. iridescent. very iridescent. trending on behance', - "cute adorable baby phoenix made of crystal ball with low poly eye's highly detailed intricated concept art trending artstation 8k", + 'cute adorable baby phoenix made of crystal ball with low poly eye\'s highly detailed intricated concept art trending artstation 8k', 'lighthouse,retro cover, high details, intricate details, by vincent di fate, artgerm julie bell beeple, 60s, inking, vintage 60s print, screen print', @@ -2,6 +2,7 @@ const API_URL = process.env.NEXT_PUBLIC_API_HOST import { EventSourcePolyfill } from 'event-source-polyfill' import { useSession } from 'next-auth/react' + import { useEventStore } from './events-store' export function useEventSource() { @@ -1,4 +1,5 @@ import { create } from 'zustand' + import { Event } from '../types' export interface EventsStore { @@ -1,10 +1,10 @@ -import { useContext } from "react" +import { useContext } from 'react' export function createUseContext(context: React.Context) { return () => { const contextValue = useContext(context) if (!contextValue) { - throw new Error("useContext must be inside a Provider with a value") + throw new Error('useContext must be inside a Provider with a value') } return contextValue } @@ -27,10 +27,10 @@ export function formatDate( options: Intl.DateTimeFormatOptions, lang?: string ) { - if (typeof date !== "object") { - date = new Date(typeof date === "number" ? date : Date.parse(date)) + if (typeof date !== 'object') { + date = new Date(typeof date === 'number' ? date : Date.parse(date)) } - const formatter = Intl.DateTimeFormat("ru", options) + const formatter = Intl.DateTimeFormat('ru', options) return formatter.format(date) } @@ -1,4 +1,4 @@ -import { FieldValues, UseFormSetValue, UseFormTrigger } from "react-hook-form" +import { FieldValues, UseFormSetValue, UseFormTrigger } from 'react-hook-form' export function makeShouldDirtySetValue( setValue: UseFormSetValue @@ -24,7 +24,7 @@ export function objectToFormdata(object: Record) { const formData = new FormData() Object.entries(object).forEach(([k, v]) => { - if (typeof v !== "object" || v instanceof File) return formData.append(k, v) + if (typeof v !== 'object' || v instanceof File) return formData.append(k, v) return formData.append(k, JSON.stringify(v)) }) @@ -1,7 +1,8 @@ -import { useThemeStore } from '#/entities/theme/model/use-theme-store' import { getDeviceType } from '../helpers' import { DeviceOs } from '../types/entities' +import { useThemeStore } from '#/entities/theme/model/use-theme-store' + export const useThemeAndDevice = (device: 'desktop' | 'mobile' = getDeviceType(), deviceOs?: DeviceOs) => { const theme = useThemeStore((state) => state.theme) @@ -1,5 +1,7 @@ import React from 'react' + import styles from './common-badge.module.scss' + import { c } from '#/shared/lib/helpers' export type CommonBagdeVariant = 'primary' | 'outline' @@ -1,6 +1,7 @@ -import { c } from '#/shared/lib/helpers' import styles from './common-button.module.scss' +import { c } from '#/shared/lib/helpers' + export type ButtonVariant = 'outline' | 'primary' | 'primary-outline' | 'gray' export interface CommonButtonProps extends React.ButtonHTMLAttributes { @@ -1,7 +1,9 @@ -import { c } from '#/shared/lib/helpers' +import React, { ForwardedRef, forwardRef, useEffect } from 'react' import { FieldError } from 'react-hook-form' + import styles from './common-input.module.scss' -import React, { ForwardedRef, forwardRef, useEffect } from 'react' + +import { c } from '#/shared/lib/helpers' export type InputVariant = 'outline' | 'primary' @@ -1,12 +1,14 @@ 'use client' import React, { HtmlHTMLAttributes, useCallback, useEffect, useMemo, useRef, useState } from 'react' -import ArrowDownSvg from '#/assets/svg/arrow-down.svg?react' +import { CSSTransition } from 'react-transition-group' + +import { SelectItem } from '../types/select-item' import styles from './common-select.module.scss' + +import ArrowDownSvg from '#/assets/svg/arrow-down.svg?react' import { c } from '#/shared' import { CommonTooltip } from '#/shared/ui/tooltip' -import { SelectItem } from '../types/select-item' -import { CSSTransition } from 'react-transition-group' interface CommonSelectProps extends HtmlHTMLAttributes { value: string | null | undefined @@ -1,4 +1,5 @@ import React, { MouseEventHandler } from 'react' + import SendMessageSvg from '#/assets/svg/send-message.svg?react' import { Loader } from '#/shared/ui/loader' @@ -1,9 +1,11 @@ -import { c } from '#/shared/lib/helpers' -import { FieldError } from 'react-hook-form' -import styles from './common-textarea.module.scss' import React, { ForwardedRef, forwardRef, useEffect, useImperativeHandle } from 'react' -import { Raleway } from 'next/font/google' +import { FieldError } from 'react-hook-form' import { useMask } from '@react-input/mask' +import { Raleway } from 'next/font/google' + +import styles from './common-textarea.module.scss' + +import { c } from '#/shared/lib/helpers' export type TextAreaVariant = 'default' | 'outline' @@ -1,7 +1,9 @@ +import Image from 'next/image' import Link from 'next/link' + import { CommonButton } from '../../button' + import styles from './info-page-template.module.scss' -import Image from 'next/image' interface InfoPageTemplateProps { primaryTitle: string @@ -6,8 +6,8 @@ import Stack from '@mui/material/Stack' import { TextFieldProps } from '@mui/material/TextField/TextField' import Image from 'next/image' -import { Calculation } from '#/features/calculation-tokens-gpt' import { useThemeStore } from '#/entities/theme/model/use-theme-store' +import { Calculation } from '#/features/calculation-tokens-gpt' import { styleInputWithoutBorderFocus } from '#/shared/ui/input' interface Input { @@ -1,7 +1,9 @@ import React, { useEffect, useMemo } from 'react' -import styles from './backdrop.module.scss' import { usePopupStore } from '../model' + +import styles from './backdrop.module.scss' + import { c } from '#/shared/lib/helpers' export const PopupBackdrop = () => { @@ -1,11 +1,14 @@ -import React, { RefObject, memo, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react' -import styles from './template.module.scss' -import { c } from '#/shared/lib/helpers' -import { usePopupStore } from '../model' -import { ClientOnly } from '#/shared/client-only' +import React, { memo, RefObject, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react' import { createPortal } from 'react-dom' import { Transition, TransitionStatus } from 'react-transition-group' +import { usePopupStore } from '../model' + +import styles from './template.module.scss' + +import { ClientOnly } from '#/shared/client-only' +import { c } from '#/shared/lib/helpers' + export type PopupTemplateVariant = 'primary' export type PopupTemplateVertical = 'top' | 'bottom' @@ -1,5 +1,5 @@ -import { min, max } from 'lodash' import { useEffect, useRef, useState } from 'react' +import { max,min } from 'lodash' const getPrecision = (num: number) => { const s = num.toString() @@ -1,7 +1,9 @@ import React, { useEffect } from 'react' -import styles from './range-slider.module.scss' + import { useRangeSlider } from '../model/use-range-slider' +import styles from './range-slider.module.scss' + interface RangeSlider { value: number title: string @@ -1,4 +1,4 @@ -import React, { forwardRef, useImperativeHandle, useMemo, useRef, useEffect } from 'react' +import React, { forwardRef, useEffect,useImperativeHandle, useMemo, useRef } from 'react' import { useHovered, useListenersThumbnail, useListenersWheel } from '../model' import { useGenerallScroll } from '../model/use-generall-scroll' @@ -3,9 +3,9 @@ import { TextField } from '@mui/material' import { TextFieldProps } from '@mui/material/TextField/TextField' import Image from 'next/image' -import { styleInputWithoutBorderFocus } from '#/shared/ui/input' - import styles from './search.module.scss' + +import { styleInputWithoutBorderFocus } from '#/shared/ui/input' export const Search = (props: TextFieldProps) => { return ( { width?: string | number @@ -2,6 +2,7 @@ import React from 'react' import Link from 'next/link' import styles from './title.module.scss' + import { c } from '#/shared' export interface CommonTitleProps { @@ -1,8 +1,9 @@ import React, { HTMLAttributes, useRef, useState } from 'react' +import { CSSTransition, Transition, TransitionStatus } from 'react-transition-group' import styles from './common-tooltip.module.scss' + import { c } from '#/shared/lib/helpers' -import { CSSTransition, Transition, TransitionStatus } from 'react-transition-group' export type CommonTooltipPosition = 'top' | 'bottom' | 'left' | 'right' @@ -1,11 +1,12 @@ import React, { useEffect, useRef } from 'react' +import { CSSTransition } from 'react-transition-group' import { Alert, Slide, Snackbar, Typography } from '@mui/material' import Image from 'next/image' -import { useThemeAndDevice } from '#/shared/lib/hooks' -import { CSSTransition } from 'react-transition-group' import { useShowDataStore } from '../lib/hooks/use-show-data' + import SuccessSvg from '#/assets/svg/success.svg?react' +import { useThemeAndDevice } from '#/shared/lib/hooks' export interface IError { handleClose?: () => void @@ -2,6 +2,7 @@ import React from 'react' import { Card, CardMedia } from '@mui/material' import Stack from '@mui/material/Stack' import Typography from '@mui/material/Typography' + import { getRandomImage } from '../lib/helpers' @@ -1,6 +1,7 @@ +import { PayProductResponse } from '../types' + import { api } from '#/shared/api' import { IOffer } from '#/widgets/payment/model/payment' -import { PayProductResponse } from '../types' export function getPaymentsPlans() { return api.get('/payments/plans') @@ -1,6 +1,7 @@ +import { ChangePassword, ChangePicture, UpdateUserSettings } from '../types' + import { api } from '#/shared/api' import { objectToFormdata } from '#/shared/lib/helpers/form' -import { ChangePassword, ChangePicture, UpdateUserSettings } from '../types' export function putUserSettings(email: string, dto: UpdateUserSettings) { return api.put('/auth/user-data', { email: email, ...dto }) @@ -1,9 +1,11 @@ import { useForm } from 'react-hook-form' + +import { changePassword } from '../api' +import { ChangePasswordForm } from '../types' + +import { withPending } from '#/shared' import { makePrivateRequest } from '#/shared/api' import { useShowDataStore } from '#/shared/lib/hooks' -import { withPending } from '#/shared' -import { ChangePasswordForm } from '../types' -import { changePassword } from '../api' export function useAccountChangePasswordForm(onClose?: Function) { const { @@ -1,10 +1,12 @@ import { useForm } from 'react-hook-form' -import { makePrivateRequest } from '#/shared/api' -import { useShowDataStore } from '#/shared/lib/hooks' -import { withPending } from '#/shared' -import { AccountSettingsForm } from '../types' + import { putUserSettings } from '../api' +import { AccountSettingsForm } from '../types' + import { useUser } from '#/entities/user-account' +import { withPending } from '#/shared' +import { makePrivateRequest } from '#/shared/api' +import { useShowDataStore } from '#/shared/lib/hooks' export function useAccountSettingsForm(onClose?: Function) { const { @@ -1,7 +1,9 @@ -import { makePrivateRequest } from '#/shared/api' -import { useShowDataStore } from '#/shared/lib/hooks' import { useState } from 'react' + import { getPaymentsPlans, payProduct } from '../api' + +import { makePrivateRequest } from '#/shared/api' +import { useShowDataStore } from '#/shared/lib/hooks' import { IOffer } from '#/widgets/payment/model/payment' export function usePaymentPage() { @@ -1,11 +1,13 @@ -import { withPending } from '#/shared' -import { makePrivateRequest } from '#/shared/api' import { useRef, useState } from 'react' +import { signOut } from 'next-auth/react' + import { activePromocode, deleteAccount, putProfilePicture } from '../api' + +import { useBalance } from '#/entities/balance' import { useUser } from '#/entities/user-account' +import { withPending } from '#/shared' +import { makePrivateRequest } from '#/shared/api' import { useShowDataStore } from '#/shared/lib/hooks' -import { signOut } from 'next-auth/react' -import { useBalance } from '#/entities/balance' export function useSettingsPage() { const fileInputRef = useRef(null) @@ -3,6 +3,7 @@ import React from 'react' import AccountBusinessAccount from './account-business-account' import AccountBusinessSecurity from './account-business-security' import AccountRegular from './account-regular' + import { BusinessHost } from '#/widgets/business-host' interface AccountContentFactoryProps { @@ -4,17 +4,18 @@ import axios from 'axios' import Image from 'next/image' import { signOut, useSession } from 'next-auth/react' +import { useAccountChangePasswordForm, useAccountSettingsForm, useSettingsPage } from '../model' + import styles from './account-settings.module.scss' +import { useUser } from '#/entities/user-account' import { ButtonUI, Input, Loader, Modal, SwitchCustom } from '#/shared' import { accountApi } from '#/shared/api/account-endpoints' import { API_URL } from '#/shared/lib/constants/constants' import { getDeviceType } from '#/shared/lib/helpers' import { useShowDataStore } from '#/shared/lib/hooks/use-show-data' -import { useUser } from '#/entities/user-account' -import { useAccountChangePasswordForm, useAccountSettingsForm, useSettingsPage } from '../model' -import { CommonInput } from '#/shared/ui/common-input' import { CommonButton } from '#/shared/ui/button' +import { CommonInput } from '#/shared/ui/common-input' const AccountSettings = () => { const { getUser, loaded, unfollowEmail, setUser } = useUser() @@ -0,0 +1,5 @@ +export * from './account' +export * from './account-content-factory' +export * from './account-settings' +export * from './payment-page' +export * from './user-settings' @@ -3,19 +3,19 @@ import ExpandMoreIcon from '@mui/icons-material/ExpandMore' import { Accordion, AccordionDetails, AccordionSummary, Box, Stack, Typography } from '@mui/material' import { useSession } from 'next-auth/react' +import { usePaymentPage } from '../model' + import styles from '#/app/styles/business.module.scss' import paymentStyles from '#/widgets/payment/ui/payment.module.scss' import { useUserStore } from '#/entities/user-account' import { NextPageWithLayout } from '#/pages/_app' +import { getDeviceType } from '#/shared' import { makePrivateRequest } from '#/shared/api' import { accountApi } from '#/shared/api/account-endpoints' import { useShowDataStore } from '#/shared/lib/hooks/use-show-data' - -import Offer from '#/widgets/payment/ui/offer' import { IOffer } from '#/widgets/payment/model/payment' -import { usePaymentPage } from '../model' -import { getDeviceType } from '#/shared' +import Offer from '#/widgets/payment/ui/offer' const PaymentPage: NextPageWithLayout = () => { const { offers, setOffers, fetchPaymentPlans, pay } = usePaymentPage() @@ -6,12 +6,12 @@ import styles from '#/app/styles/business.module.scss' import { ExpensesBlock, MailingBlock, useBusinessHostData } from '#/features/business-host-data' import { useBusinessLists } from '#/features/business-host-data/lib/use-business-lists' import { InfoAdapter } from '#/features/business-host-data/ui/info-adapter' +import { NextPageWithLayout } from '#/pages/_app' import { ModelsList } from '#/widgets/business-models' import { PersonsList } from '#/widgets/business-persons' import { BusinessGroups } from '#/widgets/business-persons/ui/business-group' import { LogList } from '#/widgets/business-persons/ui/log-list' import { SecurityList } from '#/widgets/business-persons/ui/security-list' -import { NextPageWithLayout } from '#/pages/_app' export const BusinessHost: NextPageWithLayout = () => { const { addList } = useBusinessLists() @@ -1,11 +1,12 @@ import React from 'react' import { Box, CircularProgress } from '@mui/material' +import AccountSettings from './ui/account-settings' + import styles from '#/app/styles/business.module.scss' import { useUserStore } from '#/entities/user-account' import { NextPageWithLayout } from '#/pages/_app' -import AccountSettings from './ui/account-settings' export const Settings: NextPageWithLayout = () => { const { getUser, loaded } = useUserStore() @@ -1,11 +1,12 @@ import * as React from 'react' import { useEffect, useState } from 'react' import { Box, Typography } from '@mui/material' +import axios from 'axios' import { useSession } from 'next-auth/react' -import { NextPageWithLayout } from '#/pages/_app' + import { ImageModelCard, ShortModel } from '#/entities/model-entity' import { useUserStore } from '#/entities/user-account' -import axios from 'axios' +import { NextPageWithLayout } from '#/pages/_app' import { API_URL } from '#/shared/lib/constants' export const AudioModelsPage: NextPageWithLayout = () => { @@ -1,5 +1,6 @@ -import { API_URL } from "#/shared/lib/constants" -import axios from "axios" +import axios from 'axios' + +import { API_URL } from '#/shared/lib/constants' const client_secret = process.env.NEXT_PUBLIC_DJANGO_GOOGLE_APP_CLIENT_SECRET const client_id = process.env.NEXT_PUBLIC_DJANGO_GOOGLE_APP_CLIENT_ID @@ -1,5 +1,7 @@ import React, { useEffect } from 'react' + import { getTokenByAPIGoogle } from '../api' + import { NextPageWithLayout } from '#/pages/_app' const AuthSocial: NextPageWithLayout = () => { @@ -1,8 +1,9 @@ -import { ShortModel, getChatBots } from '#/entities/model-entity' +import { useState } from 'react' + +import { getChatBots,ShortModel } from '#/entities/model-entity' import { withPending } from '#/shared' import { makePrivateRequest } from '#/shared/api' import { useShowDataStore } from '#/shared/lib/hooks' -import { useState } from 'react' export function useChatBots() { const [bots, setBots] = useState([]) @@ -1,21 +1,21 @@ import React, { useEffect, useLayoutEffect, useMemo } from 'react' +import Head from 'next/head' import { useRouter } from 'next/router' -import { CommonTitle } from '#/shared/ui/title' import styles from './chat-bot.module.scss' -import { Chats } from '#/widgets/chats' -import { NextPageWithLayout } from '#/pages/_app' -import Head from 'next/head' -import { useChatBot } from '#/entities/model-entity' -import { ModelTags } from '#/widgets/model-tags' -import { AllChatWindow } from '#/widgets/chat-window' -import { ChatModelOptions } from '#/widgets/chat-model-options' -import { getPopupById, POPUP_CHAT_BOT_PARAMS } from '#/shared/ui/popup' import { MessageEventStreamResponse, useChatBotMessages, useChatMessagesEvents } from '#/entities/message' -import { useEventSource } from '#/shared/lib/event-source' -import { useCurrentChat } from '#/features/chats' +import { useChatBot } from '#/entities/model-entity' import { useChatBotPagination } from '#/features/chat-bot-pagination' +import { useCurrentChat } from '#/features/chats' +import { NextPageWithLayout } from '#/pages/_app' +import { useEventSource } from '#/shared/lib/event-source' +import { getPopupById, POPUP_CHAT_BOT_PARAMS } from '#/shared/ui/popup' +import { CommonTitle } from '#/shared/ui/title' +import { ChatModelOptions } from '#/widgets/chat-model-options' +import { AllChatWindow } from '#/widgets/chat-window' +import { Chats } from '#/widgets/chats' +import { ModelTags } from '#/widgets/model-tags' export interface ChatBotPageProps {} @@ -1,13 +1,14 @@ import * as React from 'react' import { useEffect } from 'react' -import { NextPageWithLayout } from '#/pages/_app' -import { ChatModelCard } from '#/entities/model-entity' +import { useChatBots } from '../model' import styles from './chat-bots.module.scss' -import { Loader } from '#/shared' -import { useChatBots } from '../model' + +import { ChatModelCard } from '#/entities/model-entity' import { useUserStore } from '#/entities/user-account' +import { NextPageWithLayout } from '#/pages/_app' +import { Loader } from '#/shared' const Page: NextPageWithLayout = () => { const { getUser } = useUserStore() @@ -3,10 +3,10 @@ import { Box, Typography } from '@mui/material' import axios from 'axios' import Link from 'next/link' import { useRouter } from 'next/router' +import { signIn } from 'next-auth/react' -import { API_URL } from '#/shared/lib/constants/constants' import { NextPageWithLayout } from '#/pages/_app' -import { signIn } from 'next-auth/react' +import { API_URL } from '#/shared/lib/constants/constants' const Confirm: NextPageWithLayout = () => { const { push } = useRouter() @@ -15,7 +15,7 @@ const Confirm: NextPageWithLayout = () => { useEffect(() => { let formData: any = new FormData() const tokenData = window.location.search.slice(1).split('=')[1] - formData.append("token", tokenData) + formData.append('token', tokenData) axios.post(API_URL + '/auth/confirm', formData, { headers: { @@ -1,8 +1,9 @@ -import { ShortModel, getImageBots } from '#/entities/model-entity' +import { useState } from 'react' + +import { getImageBots,ShortModel } from '#/entities/model-entity' import { withPending } from '#/shared' import { makePrivateRequest } from '#/shared/api' import { useShowDataStore } from '#/shared/lib/hooks' -import { useState } from 'react' export function useImageBots() { const [bots, setBots] = useState([]) @@ -9,19 +9,19 @@ import BlockedSvg from '#/assets/svg/blocked.svg?react' import { useImageBot } from '#/entities/model-entity/model/use-image-bot' import { useImageBotCreateImage } from '#/features/image-bot-create-image' import { useImagesBotFilters } from '#/features/image-bot-filters' +import { useImageBotInput } from '#/features/image-bot-input' import { useImageBotPagination } from '#/features/image-bot-pagination' +import { ModelInput } from '#/features/model-input' import { NextPageWithLayout } from '#/pages/_app' import { Loader } from '#/shared' import { c, getDeviceType, getOs } from '#/shared/lib/helpers' import { useThemeAndDevice } from '#/shared/lib/hooks' -import { SvgIcon } from '#/shared/ui/svg' -import { ImageMessagesList } from '#/widgets/messages' -import { ModelInput } from '#/features/model-input' import { useShowDataStore } from '#/shared/lib/hooks/use-show-data' +import { getPopupById,POPUP_IMAGE_BOT_PARAMS } from '#/shared/ui/popup' +import { SvgIcon } from '#/shared/ui/svg' import { CommonTitle } from '#/shared/ui/title' import { ImageModelOptions } from '#/widgets/image-model-options' -import { useImageBotInput } from '#/features/image-bot-input' -import { POPUP_IMAGE_BOT_PARAMS, getPopupById } from '#/shared/ui/popup' +import { ImageMessagesList } from '#/widgets/messages' const ImageModelPage: NextPageWithLayout = () => { const { botParams, fetchBotParams } = useImageBot() @@ -2,17 +2,16 @@ import * as React from 'react' import { useMemo } from 'react' import { Box, Stack, Typography } from '@mui/material' - import styles from '#/app/styles/styles-pages/index-styles.module.scss' + +import { useUserStore } from '#/entities/user-account' +import { NextPageWithLayout } from '#/pages/_app' import { ReferralBlock } from '#/shared' +import { getDeviceType } from '#/shared/lib/helpers/get-type-device' import { getCurrentTimeAndGreeting } from '#/shared/lib/helpers/getCurrentDateForMainScreen' - import { DemoInfo } from '#/shared/ui/demo-info' import { SocialMedia } from '#/shared/ui/social-media-block' import { Statistics } from '#/widgets/stats/stats' -import { NextPageWithLayout } from '#/pages/_app' -import { getDeviceType } from '#/shared/lib/helpers/get-type-device' -import { useUserStore } from '#/entities/user-account' export interface MainPageProps {} @@ -1,5 +1,6 @@ import React from 'react' import { useRouter } from 'next/router' + import { NextPageWithLayout } from '#/pages/_app' import { InfoPageTemplate } from '#/shared/ui/info-page-template' @@ -1,5 +1,6 @@ import React, { useEffect } from 'react' import { useRouter } from 'next/router' + import { NextPageWithLayout } from '#/pages/_app' import { InfoPageTemplate } from '#/shared/ui/info-page-template' @@ -11,10 +11,10 @@ import styles from './register.module.scss' import { useThemeStore } from '#/entities/theme/model/use-theme-store' import { useUserStore } from '#/entities/user-account' import { useUserReferralStore } from '#/entities/user-account/model/use-user-referral-store' +import { RegisterEmailForm } from '#/features/register-by-email' import { YandexAuthButton } from '#/features/yandex-auth-button' import { NextPageWithLayout } from '#/pages/_app' import { getDeviceType } from '#/shared/lib/helpers' -import { RegisterEmailForm } from '#/features/register-by-email' const Register: NextPageWithLayout = () => { const device = getDeviceType() @@ -26,9 +26,6 @@ const Register: NextPageWithLayout = () => { const theme = useThemeStore((state) => state.theme) const { addReferral } = useUserReferralStore() - const { getUser } = useUserStore() - - const user = getUser() const { push } = useRouter() @@ -1,13 +1,14 @@ import React from 'react' -import { NextPageWithLayout } from '#/pages/_app' -import { useErrorReport } from '#/features/error-report/model/use-error-report' import styles from './error-mobile.module.scss' -import { c } from '#/shared' -import { CommonTextArea } from '#/shared/ui/common-textarea' + import AttachSvg from '#/assets/svg/attach.svg?react' import PlusSvg from '#/assets/svg/plus.svg?react' +import { useErrorReport } from '#/features/error-report/model/use-error-report' +import { NextPageWithLayout } from '#/pages/_app' +import { c } from '#/shared' import { CommonButton } from '#/shared/ui/button/ui' +import { CommonTextArea } from '#/shared/ui/common-textarea' const ReportsMobile: NextPageWithLayout = () => { const { error, isSend, setErrorMessage, handleFileChange, file, setFile, sendError, handleGoBackPage } = useErrorReport() @@ -1,5 +1,6 @@ import React from 'react' import { useRouter } from 'next/router' + import { NextPageWithLayout } from '#/pages/_app' import { InfoPageTemplate } from '#/shared/ui/info-page-template' @@ -1,8 +1,10 @@ -import { NextPageWithLayout } from '#/pages/_app' import Image from 'next/image' import Link from 'next/link' + import styles from './telegram-blocked.module.scss' +import { NextPageWithLayout } from '#/pages/_app' + const TelegramBlockedPage: NextPageWithLayout = () => { return (
@@ -1,7 +1,8 @@ import React from 'react' import { Box } from '@mui/material' -import { WhisperWidget } from '#/widgets/whisper' + import { NextPageWithLayout } from '#/pages/_app' +import { WhisperWidget } from '#/widgets/whisper' const Whisper: NextPageWithLayout = () => { return ( @@ -3,9 +3,9 @@ import { Box, Typography } from '@mui/material' import Image from 'next/image' import Link from 'next/link' -import { ButtonUI } from '#/shared' - import styles from './screen-for-inactive.module.scss' + +import { ButtonUI } from '#/shared' export const ScreenForInactive = () => { return ( @@ -27,7 +27,7 @@ const BusinessHostOptimized: React.FC = () => { const { securityList, personsList } = usePersonsStore() const { addList } = useBusinessLists() - const { updateMailingSettings, downloadExpensesReport, updateMailingEmails } = useBusinessHostData() + const { updateMailingSettings, downloadExpensesReport, updateMailingEmails, emails } = useBusinessHostData() useEffect(() => { if (error) { @@ -88,7 +88,7 @@ const BusinessHostOptimized: React.FC = () => { - + ) } @@ -0,0 +1 @@ +export { default as BusinessHost } from './ui/business-host-optimized' @@ -0,0 +1 @@ +export { BusinessHost } from './business-host' \ No newline at end of file @@ -4,14 +4,14 @@ import Switch from '@mui/material/Switch' import axios from 'axios' import { useSession } from 'next-auth/react' -import { useBalanceStore } from '#/entities/balance/model/use-balance-store' -import { Balance } from '#/shared' -import { API_URL } from '#/shared/lib/constants' - import { getInfo, InfoBusiness } from '../../api/get-info' import styles from './info.module.scss' + +import { useBalanceStore } from '#/entities/balance/model/use-balance-store' import { useUserStore } from '#/entities/user-account' +import { Balance } from '#/shared' +import { API_URL } from '#/shared/lib/constants' export const Info = ({ security, @@ -1,9 +1,11 @@ -import { AllowedModels, addAccess, removeAccess } from '#/features/change-access-to-model' -import { makePrivateRequest } from '#/shared/api' -import { useShowDataStore } from '#/shared/lib/hooks' import { useState } from 'react' + import { getModels } from '../api' +import { addAccess, AllowedModels, removeAccess } from '#/features/change-access-to-model' +import { makePrivateRequest } from '#/shared/api' +import { useShowDataStore } from '#/shared/lib/hooks' + export function useBusinessModels() { const [models, setModels] = useState([]) @@ -8,11 +8,13 @@ import TableContainer from '@mui/material/TableContainer' import TableHead from '@mui/material/TableHead' import TableRow from '@mui/material/TableRow' +import { useBusinessModels } from '../model' + +import styles from './models-list.module.scss' + import { AllowedModels, SwitchAccess } from '#/features/change-access-to-model' import { translateTypeModel } from '#/shared' import ArrowUpOrDown from '#/widgets/top-bar-model/ui/arrow-up-or-down' -import styles from './models-list.module.scss' -import { useBusinessModels } from '../model' export const ModelsList = () => { const [showModels, setShowModels] = useState(true) @@ -1,6 +1,7 @@ +import { LogsListGetParams } from '../types' + import { ResponseGetLogsList } from '#/features/invite-person-in-business' import { api } from '#/shared/api' -import { LogsListGetParams } from '../types' export function getLogsList({ from, to, type, ...dto }: Partial) { return api.get('/auth/business-host/logs/', {params: { @@ -1,8 +1,9 @@ +import { useMemo, useState } from 'react' + import { deleteBusinessGroup, getBusinessGroups } from '#/features/business-group/api' import { ResponseGetBusinessGroups } from '#/features/invite-person-in-business' import { makePrivateRequest } from '#/shared/api' import { useShowDataStore } from '#/shared/lib/hooks' -import { useMemo, useState } from 'react' export function useBusinessGroups() { const [businessGroups, setBusinessGroups] = useState([]) @@ -1,7 +1,9 @@ -import { ResponseGetIpList } from '#/features/invite-person-in-business' -import { makePrivateRequest } from '#/shared/api' import { useMemo, useState } from 'react' + import { getIpList } from '../api' + +import { ResponseGetIpList } from '#/features/invite-person-in-business' +import { makePrivateRequest } from '#/shared/api' import { useShowDataStore } from '#/shared/lib/hooks' export function useIpList() { @@ -1,9 +1,11 @@ -import { ResponseGetLogsList } from '#/features/invite-person-in-business' -import { Dayjs } from 'dayjs' import { useMemo, useState } from 'react' +import { Dayjs } from 'dayjs' + +import { getLogsList } from '../api' import { LogType } from '../types' + +import { ResponseGetLogsList } from '#/features/invite-person-in-business' import { makePrivateRequest } from '#/shared/api' -import { getLogsList } from '../api' import { useShowDataStore } from '#/shared/lib/hooks' export function useLogList() { @@ -1,6 +1,7 @@ +import { useMemo, useState } from 'react' + import { ResponseGetPersons } from '#/features/invite-person-in-business' import { useShowDataStore } from '#/shared/lib/hooks' -import { useMemo, useState } from 'react' export function usePersonsList( personsList: ResponseGetPersons[], @@ -1,6 +1,7 @@ +import { useMemo, useState } from 'react' + import { ResponseGetPersons } from '#/features/invite-person-in-business' import { useShowDataStore } from '#/shared/lib/hooks' -import { useMemo, useState } from 'react' export function useSecurityList( securityList: ResponseGetPersons[], @@ -1,4 +1,5 @@ import React, { useEffect, useMemo, useState } from 'react' +import { createPortal } from 'react-dom' import Paper from '@mui/material/Paper' import Table from '@mui/material/Table' import TableBody from '@mui/material/TableBody' @@ -12,12 +13,11 @@ import styles from '#/widgets/business-models/ui/models-list.module.scss' import { AddBusinessGroup } from '#/features/business-group' import { ChangeBusinessGroup } from '#/features/business-group/ui/change-business-group-modal' +import { ADD_BUSINESS_GROUP, CHANGE_BUSINESS_GROUP, getModalById } from '#/features/modals' import { ClientOnly } from '#/shared' -import ArrowUpOrDown from '#/widgets/top-bar-model/ui/arrow-up-or-down' -import { createPortal } from 'react-dom' import { CommonInput } from '#/shared/ui/common-input' -import { ADD_BUSINESS_GROUP, CHANGE_BUSINESS_GROUP, getModalById } from '#/features/modals' import { useBusinessGroups } from '#/widgets/business-persons' +import ArrowUpOrDown from '#/widgets/top-bar-model/ui/arrow-up-or-down' export const BusinessGroups = ({ company_uid }: { company_uid?: string }) => { const { @@ -7,10 +7,13 @@ import TableCell from '@mui/material/TableCell' import TableContainer from '@mui/material/TableContainer' import TableHead from '@mui/material/TableHead' import TableRow from '@mui/material/TableRow' -import { Search } from '#/shared' + +import { useIpList } from '../model' + import styles from '#/widgets/business-models/ui/models-list.module.scss' + +import { Search } from '#/shared' import ArrowUpOrDown from '#/widgets/top-bar-model/ui/arrow-up-or-down' -import { useIpList } from '../model' export const IpList = () => { const { fetchIpList, ipList, searchedIps, search, setSearch } = useIpList() @@ -10,14 +10,16 @@ import TableRow from '@mui/material/TableRow' import { Dayjs } from 'dayjs' import { useSession } from 'next-auth/react' -import { ResponseGetLogsList } from '#/features/invite-person-in-business/model/types' +import { useLogList } from '../model' + +import styles from '#/widgets/business-models/ui/models-list.module.scss' + import { useThemeStore } from '#/entities/theme/model/use-theme-store' +import { ResponseGetLogsList } from '#/features/invite-person-in-business/model/types' import { Search } from '#/shared' import { DateInput } from '#/shared/ui/date-input/date-input' -import styles from '#/widgets/business-models/ui/models-list.module.scss' import { getLogsList } from '#/widgets/business-persons/api/get-logsList' import ArrowUpOrDown from '#/widgets/top-bar-model/ui/arrow-up-or-down' -import { useLogList } from '../model' export const LogList = () => { const { fetchLogs, setFrom, to, from, setTo, type, setType, search, setSearch, searchedLogs } = @@ -7,19 +7,18 @@ import TableCell from '@mui/material/TableCell' import TableContainer from '@mui/material/TableContainer' import TableHead from '@mui/material/TableHead' import TableRow from '@mui/material/TableRow' -import { useSession } from 'next-auth/react' import Image from 'next/image' +import { useSession } from 'next-auth/react' + +import { formatDateStatus, formatEmail,translateEmailStatus } from '../lib/lib' +import { usePersonsList } from '../model' + +import styles from './persons-list.module.scss' import { PersonInBusiness } from '#/features/business-security-download' import { LimitModal } from '#/features/change-limit' import { InviteModal, ResponseGetPersons, RoleSelect } from '#/features/invite-person-in-business' -import { XMark } from '#/features/remove-person' -import { Error, formatDate, Search } from '#/shared' -import styles from './persons-list.module.scss' -import { getPersons } from '#/widgets/business-persons/api/get-persons' -import ArrowUpOrDown from '#/widgets/top-bar-model/ui/arrow-up-or-down' - -import { translateEmailStatus, formatDateStatus, formatEmail } from '../lib/lib' +import { ResponseGetBusinessGroups } from '#/features/invite-person-in-business/model/types' import { getModalById, INVITE_USER, @@ -27,9 +26,11 @@ import { PLATE_CHANGE_PASSWORD, RESEND_INVATION_PASSWORD, } from '#/features/modals' -import { ResponseGetBusinessGroups } from '#/features/invite-person-in-business/model/types' +import { XMark } from '#/features/remove-person' +import { Error, formatDate, Search } from '#/shared' import { useShowDataStore } from '#/shared/lib/hooks/use-show-data' -import { usePersonsList } from '../model' +import { getPersons } from '#/widgets/business-persons/api/get-persons' +import ArrowUpOrDown from '#/widgets/top-bar-model/ui/arrow-up-or-down' export const PersonsList = ({ personsList, @@ -8,22 +8,24 @@ import TableContainer from '@mui/material/TableContainer' import TableHead from '@mui/material/TableHead' import TableRow from '@mui/material/TableRow' import Image from 'next/image' -import { InviteSecurityModal, ResponseGetPersons, RoleSelect } from '#/features/invite-person-in-business' + +import { formatDateStatus, formatEmail, translateEmailStatus } from '../lib/lib' +import { useSecurityList } from '../model' + import styles from './persons-list.module.scss' -import { Search } from '#/shared' -import ArrowUpOrDown from '#/widgets/top-bar-model/ui/arrow-up-or-down' + +import { LimitModal } from '#/features/change-limit' +import { InviteSecurityModal, ResponseGetPersons, RoleSelect } from '#/features/invite-person-in-business' import { getModalById, LIMIT_SECURITY_MODAL, PLATE_CHANGE_PASSWORD, RESEND_INVATION_PASSWORD, } from '#/features/modals' - -import { formatDateStatus, formatEmail, translateEmailStatus } from '../lib/lib' import { XMark } from '#/features/remove-person' +import { Search } from '#/shared' import { useShowDataStore } from '#/shared/lib/hooks/use-show-data' -import { useSecurityList } from '../model' -import { LimitModal } from '#/features/change-limit' +import ArrowUpOrDown from '#/widgets/top-bar-model/ui/arrow-up-or-down' export const SecurityList = ({ securityList, @@ -1,7 +1,8 @@ +import { useState } from 'react' + import { useChatBot } from '#/entities/model-entity' import { getDeviceType } from '#/shared' import { getPopupById, POPUP_CHAT_BOT_PARAMS } from '#/shared/ui/popup' -import { useState } from 'react' export const useChatModelOptions = () => { const deviceType = getDeviceType() @@ -1,11 +1,13 @@ -import BotParamsMap from '#/features/bot-params/ui/bot-params-map' -import { c } from '#/shared' +import { HtmlHTMLAttributes, useState } from 'react' + import styles from './chat-model-options.module.scss' + import ArrowDownSvg from '#/assets/svg/arrow-down.svg?react' -import { HtmlHTMLAttributes, useState } from 'react' import { useChatBot } from '#/entities/model-entity' +import BotParamsMap from '#/features/bot-params/ui/bot-params-map' import { ModelParamsSelect } from '#/features/model-params-select' import { ResetBotFilters } from '#/features/reset-bot-filters' +import { c } from '#/shared' interface ChatModelOptionsProps extends HtmlHTMLAttributes { isMobile?: boolean @@ -1,6 +1,7 @@ +import { createContext } from 'react' + import { useChatBotInput } from '#/features/chat-bot-input' import { createUseContext } from '#/shared' -import { createContext } from 'react' export const ChatWindowContext = createContext | null>(null) @@ -1,21 +1,21 @@ import React, { useEffect, useLayoutEffect, useMemo, useState } from 'react' -import { ChatMessagesList } from '#/widgets/messages' -import BlockedSvg from '#/assets/svg/blocked.svg?react' +import { ChatWindowContextProvider } from '../model' +import 'intro.js/introjs.css' import styles from './chat-window.module.scss' -import 'intro.js/introjs.css' -import { c } from '#/shared' +import BlockedSvg from '#/assets/svg/blocked.svg?react' +import { useCurrentChat } from '#/entities/chat' +import { useChatBotMessages } from '#/entities/message' import { Model, useChatBotParams } from '#/entities/model-entity' -import { ModelInput } from '#/features/model-input' -import { useShowDataStore, useThemeAndDevice } from '#/shared/lib/hooks' import { useChatBotInput } from '#/features/chat-bot-input' import { useChatImageLoad } from '#/features/chat-image-load' +import { ModelInput } from '#/features/model-input' import { useChatMessageActions } from '#/features/use-chat-message-actions' -import { ChatWindowContextProvider } from '../model' -import { useChatBotMessages } from '#/entities/message' -import { useCurrentChat } from '#/entities/chat' +import { c } from '#/shared' +import { useShowDataStore, useThemeAndDevice } from '#/shared/lib/hooks' +import { ChatMessagesList } from '#/widgets/messages' export interface ChatProps { setOpenFiltersMobile: React.Dispatch> @@ -1,15 +1,15 @@ import React, { HtmlHTMLAttributes, RefObject, useEffect, useMemo, useRef } from 'react' -import { useChats } from '#/features/chats' -import { c } from '#/shared' - import styles from './chats.module.scss' -import { CommonTooltip } from '#/shared/ui/tooltip' + import PlusSvg from '#/assets/svg/plus.svg?react' import { ChatButton, useChatActions } from '#/entities/chat' +import { useChatBotMessages } from '#/entities/message' import { useChatBot, useChatBotParams } from '#/entities/model-entity' +import { useChats } from '#/features/chats' +import { c } from '#/shared' import { isBottom } from '#/shared/lib/helpers/refs' -import { useChatBotMessages } from '#/entities/message' +import { CommonTooltip } from '#/shared/ui/tooltip' export interface ChatProps extends HtmlHTMLAttributes {} @@ -5,8 +5,10 @@ import { SelectChangeEvent } from '@mui/material/Select' import Stack from '@mui/material/Stack' import { styled } from '@mui/material/styles' -import { TutorialContext } from '#/features/tutorial-context/tutorial-context' +import 'intro.js/introjs.css' + import { useThemeStore } from '#/entities/theme/model/use-theme-store' +import { TutorialContext } from '#/features/tutorial-context/tutorial-context' import { Select, Slider as Sl, SwitchCustom, TooltipCustom } from '#/shared' import { ITypeModels, @@ -17,8 +19,6 @@ import { import FiltersMobile from '#/widgets/filters-gpt/ui/filters-mobile' import TooltipModelTypes from '#/widgets/filters-gpt/ui/tooltip-model-types' -import 'intro.js/introjs.css' - interface IFiltersChatGPTMobile { open?: boolean handleOpenFilters?: () => void @@ -1,13 +1,15 @@ -import BotParamsMap from '#/features/bot-params/ui/bot-params-map' -import { c } from '#/shared' +import { HtmlHTMLAttributes, useState } from 'react' + import styles from './image-model-options.module.scss' + import ArrowDownSvg from '#/assets/svg/arrow-down.svg?react' -import { HtmlHTMLAttributes, useState } from 'react' -import { ResetBotFilters } from '#/features/reset-bot-filters' import { useImageBot } from '#/entities/model-entity/model/use-image-bot' -import { ImageModelParamsSelect } from '#/features/image-model-params-select' +import BotParamsMap from '#/features/bot-params/ui/bot-params-map' import { ImageBotParamsMap } from '#/features/image-bot-params' +import { ImageModelParamsSelect } from '#/features/image-model-params-select' +import { ResetBotFilters } from '#/features/reset-bot-filters' import { ResetImageBotFilters } from '#/features/reset-image-bot-filters' +import { c } from '#/shared' interface ImageModelOptionsProps extends HtmlHTMLAttributes { isMobile?: boolean @@ -1,12 +1,13 @@ -import { ShortModel } from '#/entities/model-entity' import React, { useMemo } from 'react' import styles from './image-popup-model.module.scss' -import { c, formatDate } from '#/shared/lib/helpers' -import SuccessRoundedSvg from '#/assets/svg/success-rounded.svg?react' + import ClockSvg from '#/assets/svg/clock.svg?react' import LightningSvg from '#/assets/svg/lightning.svg?react' import LockSvg from '#/assets/svg/lock.svg?react' +import SuccessRoundedSvg from '#/assets/svg/success-rounded.svg?react' +import { ShortModel } from '#/entities/model-entity' +import { c, formatDate } from '#/shared/lib/helpers' interface ImagePopupModelProps extends ShortModel { active: boolean @@ -1,7 +1,8 @@ import { Attributes, FC, ReactElement } from 'react' -import { Layout } from '../ui' -import { LayoutProps } from '../types' import React from 'react' + +import { LayoutProps } from '../types' +import { Layout } from '../ui' import { AdminLayout } from '../ui/admin' export const getDefaultLayout = function (layoutProps: Omit = {}) { @@ -1,12 +1,16 @@ -import { useUserStore } from '#/entities/user-account' -import { c, getDeviceType } from '#/shared' +import { useState } from 'react' +import Link from 'next/link' import { useRouter } from 'next/router' + +import { adminLinks } from '../config' import { LayoutProps } from '../types' + import { Layout } from './default' -import { useState } from 'react' + import styles from './admin.module.scss' -import Link from 'next/link' -import { adminLinks } from '../config' + +import { useUserStore } from '#/entities/user-account' +import { c, getDeviceType } from '#/shared' export function AdminLayout({ children, ...props }: LayoutProps) { const device = getDeviceType() @@ -23,6 +27,7 @@ export function AdminLayout({ children, ...props }: LayoutProps) {
    {adminLinks.map((item, index) => (
  • push(item.link)} className={c( styles.items__link, @@ -1,29 +1,31 @@ import React, { useEffect, useRef, useState } from 'react' +import { CSSTransition, SwitchTransition } from 'react-transition-group' import { Box } from '@mui/material' import Head from 'next/head' import { useRouter } from 'next/router' import { getSession, signOut, useSession } from 'next-auth/react' -import { useTheme } from '#/entities/theme' -import InfoBar from '#/app/layout/ui/info-bar' -import { Loader } from '#/shared' -import { MainMenuMobile } from '#/widgets/main-menu' -import { SideMenu } from '#/widgets/side-menu' -import { getDeviceType } from '#/shared/lib/helpers' import { LayoutProps } from '../types' -// import { change, setLoaded } from '#/features/pending' -import { ChangePasswordPlate } from '#/features/change-password-corp' -import { ResendInvationPlate } from '#/features/resend-invation-corp' -import { PopupBackdrop } from '#/shared/ui/popup' -import { ErrorReportPlate } from '#/features/error-report' -import { CSSTransition, SwitchTransition } from 'react-transition-group' + import styles from './default.module.scss' -import { SlowLoading } from '#/features/slow-loading' + +import InfoBar from '#/app/layout/ui/info-bar' +import { useBalance } from '#/entities/balance' import { ChatBotOptionsPopup } from '#/entities/chat/ui/chat-bot-options-popup' import { ImageBotOptionsPopup } from '#/entities/model-entity' -import { useAuthSession } from '#/features/auth/model/use-auth-session' +import { useTheme } from '#/entities/theme' import { useUser } from '#/entities/user-account' -import { useBalance } from '#/entities/balance' +import { useAuthSession } from '#/features/auth/model/use-auth-session' +// import { change, setLoaded } from '#/features/pending' +import { ChangePasswordPlate } from '#/features/change-password-corp' +import { ErrorReportPlate } from '#/features/error-report' +import { ResendInvationPlate } from '#/features/resend-invation-corp' +import { SlowLoading } from '#/features/slow-loading' +import { Loader } from '#/shared' +import { getDeviceType } from '#/shared/lib/helpers' +import { PopupBackdrop } from '#/shared/ui/popup' +import { MainMenuMobile } from '#/widgets/main-menu' +import { SideMenu } from '#/widgets/side-menu' export const Layout: React.FC = ({ children, titlePage, height, device = getDeviceType() }) => { const { fetchUser, loaded, loading } = useUser() @@ -1,9 +1,11 @@ import React, { Component, FunctionComponent } from 'react' -import { LayoutProps } from '../types' import { Box } from '@mui/material' import Head from 'next/head' -import { getDeviceType } from '#/shared/lib/helpers' + +import { LayoutProps } from '../types' + import { useTheme } from '#/entities/theme' +import { getDeviceType } from '#/shared/lib/helpers' export const LayoutWithoutSideMenu = ({ children, titlePage, device = getDeviceType() }: LayoutProps) => { const desktop = device === 'desktop' @@ -18,11 +18,11 @@ import Link from 'next/link' import Router, { useRouter } from 'next/router' import { signOut, useSession } from 'next-auth/react' -import { useThemeStore } from '#/entities/theme/model/use-theme-store' -import { AccountMenu } from '#/shared' - import { menuListMiddle, menuListTop } from '../../side-menu/ui/side-menu' + +import { useThemeStore } from '#/entities/theme/model/use-theme-store' import { useUserStore } from '#/entities/user-account' +import { AccountMenu } from '#/shared' export const MainMenuMobile = memo(() => { const { data, status } = useSession() @@ -9,11 +9,11 @@ import Router, { useRouter } from 'next/router' import { useSession } from 'next-auth/react' import { useThemeStore } from '#/entities/theme/model/use-theme-store' +import { useUserStore } from '#/entities/user-account' +import { ERROR_REPORT, getModalById } from '#/features/modals' import { AccountMenu } from '#/shared' import { NotificationMenu } from '#/shared' import { TooltipFreeTokens } from '#/shared' -import { ERROR_REPORT, getModalById } from '#/features/modals' -import { useUserStore } from '#/entities/user-account' function a11yProps(index: number) { return { @@ -2,10 +2,12 @@ import React, { memo, useEffect, useState } from 'react' import ReactMarkdown from 'react-markdown' import dynamic from 'next/dynamic' import remarkGfm from 'remark-gfm' -import { useThemeAndDevice } from '#/shared/lib/hooks' -import { c } from '#/shared' + import styles from './markdown.module.scss' + +import { c } from '#/shared' import { EventBus, eventBus } from '#/shared/classes' +import { useThemeAndDevice } from '#/shared/lib/hooks' interface IProps { id?: string @@ -1,7 +1,8 @@ +import axios, { AxiosError, AxiosResponse } from 'axios' + import { Message, MessageSend } from '#/entities/message' import { API_URL } from '#/shared/lib/constants' import { IMessageRequest } from '#/shared/lib/types/types-gpt' -import axios, { AxiosError, AxiosResponse } from 'axios' export async function getImagesGalery(token?: string, offset?: number, limit = 10) { return await axios.get(API_URL + `/media/gallery/images?limit=${limit}&offset=${offset}`, { @@ -1,6 +1,7 @@ +import { useMemo, useState } from 'react' + import { Message, useChatBotMessages } from '#/entities/message' import { stringIsImage } from '#/shared' -import { useMemo, useState } from 'react' export function useChatMessageImage() { const { messages } = useChatBotMessages() @@ -1,12 +1,12 @@ -import { getUserBalance } from '#/entities/balance' -import { Message } from '#/entities/message' - +import { useCallback,useEffect, useRef, useState } from 'react' import { useSession } from 'next-auth/react' -import { useState, useRef, useEffect, useCallback } from 'react' + import { getImagesGalery } from '../api' -import { Device } from '#/shared/lib/types/entities' import { formDataHelper } from '../lib' +import { Message } from '#/entities/message' +import { Device } from '#/shared/lib/types/entities' + export function useImagesPagination(showError: (message: string) => void, type: string, device: Device) { const { data } = useSession() @@ -1,6 +1,7 @@ -import { Message } from '#/entities/message' import { useMemo, useState } from 'react' +import { Message } from '#/entities/message' + export const useMessages = (messages: Message[]) => { const [chosenImage, setChosenImage] = useState(null) @@ -1,23 +1,27 @@ -import React, { RefObject, memo, useCallback, useEffect, useMemo, useRef, useState } from 'react' -import { IsNextDay } from '#/widgets/messages/ui/is-next-day' -import { ClientOnly, Loader, c } from '#/shared' +import React, { memo, RefObject, useCallback, useEffect, useMemo, useRef, useState } from 'react' +import { createPortal } from 'react-dom' +import { CSSTransition, SwitchTransition, TransitionGroup } from 'react-transition-group' +import { esES } from '@mui/x-date-pickers' +import { useRouter } from 'next/router' + +import { useChatMessageImage } from '../model/use-chat-message-image' + +import { PreviewView } from '.' + +import styles from './chat-messages-list.module.scss' + +import ArrowDownSvg from '#/assets/svg/arrow-down.svg?react' +import { useChatBotMessages } from '#/entities/message' import { Model, useChatBot } from '#/entities/model-entity' import { useChatBotPagination } from '#/features/chat-bot-pagination' import { useCurrentChat } from '#/features/chats' -import { CommonScrollbar } from '#/shared/ui/scrollbar' -import styles from './chat-messages-list.module.scss' -import { useRouter } from 'next/router' -import { useChatBotMessages } from '#/entities/message' -import { PreviewView } from '.' -import { CSSTransition, SwitchTransition, TransitionGroup } from 'react-transition-group' -import { isBottom } from '#/shared/lib/helpers/refs' -import { createPortal } from 'react-dom' import { ImageModal } from '#/features/image-modal' -import { useChatMessageImage } from '../model/use-chat-message-image' import { useModelInputStore } from '#/features/model-input/model' +import { c,ClientOnly, Loader } from '#/shared' +import { isBottom } from '#/shared/lib/helpers/refs' +import { CommonScrollbar } from '#/shared/ui/scrollbar' import { useChatWindowContext } from '#/widgets/chat-window/model' -import ArrowDownSvg from '#/assets/svg/arrow-down.svg?react' -import { esES } from '@mui/x-date-pickers' +import { IsNextDay } from '#/widgets/messages/ui/is-next-day' interface IMessagesList { model: Model | null @@ -1,12 +1,14 @@ import React from 'react' -import { ClientOnly, TooltipCustom, c, getDeviceType } from '#/shared' - -import styles from './image-messages-list.module.scss' import { createPortal } from 'react-dom' + import { useMessages } from '../model/use-messages' -import { ImageModal } from '#/features/image-modal' + +import styles from './image-messages-list.module.scss' + import { ImageMessage, Message } from '#/entities/message' +import { ImageModal } from '#/features/image-modal' import { GALLERY_IMAGES, getModalById } from '#/features/modals' +import { c, ClientOnly, getDeviceType,TooltipCustom } from '#/shared' interface ImageMessagesListProps { device: 'mobile' | 'desktop' @@ -1,8 +1,8 @@ import React, { - HTMLAttributes, - RefObject, forwardRef, + HTMLAttributes, memo, + RefObject, useEffect, useImperativeHandle, useMemo, @@ -10,16 +10,17 @@ import React, { } from 'react' import { Box, Typography } from '@mui/material' -import { getDateFromString } from '#/widgets/messages/lib/date-from-string' -import { getDayMontsString } from '#/widgets/messages/lib/day-months-string' -import { BotMessage, UserMessage } from '#/widgets/messages' +import styles from './is-next-day.module.scss' + import { Message, useChatBotMessages } from '#/entities/message' -import { useThemeAndDevice } from '#/shared/lib/hooks' import { Model } from '#/entities/model-entity' -import { Loader, c } from '#/shared' -import styles from './is-next-day.module.scss' -import { CommonTooltipPosition } from '#/shared/ui/tooltip' +import { c,Loader } from '#/shared' +import { useThemeAndDevice } from '#/shared/lib/hooks' import { CommonScrollbarRef } from '#/shared/ui/scrollbar' +import { CommonTooltipPosition } from '#/shared/ui/tooltip' +import { BotMessage, UserMessage } from '#/widgets/messages' +import { getDateFromString } from '#/widgets/messages/lib/date-from-string' +import { getDayMontsString } from '#/widgets/messages/lib/day-months-string' interface IsNextDayProps { message: Message @@ -1,8 +1,10 @@ -import { ModelTag } from '#/entities/model-entity' -import { SvgIcon } from '#/shared/ui/svg' import React from 'react' + import styles from './model-tags.module.scss' +import { ModelTag } from '#/entities/model-entity' +import { SvgIcon } from '#/shared/ui/svg' + interface ModelTagsProps { tags: ModelTag[] } @@ -1,6 +1,8 @@ +import axios from 'axios' + import { NavigationSearchModelLink } from './types' + import { API_URL } from '#/shared/lib/constants' -import axios from 'axios' export const getModelChatLinks = async (token: string) => { return await axios.get(API_URL + '/api/chats/links', { @@ -1,9 +1,10 @@ import { useEffect, useId, useMemo, useState } from 'react' -import { NavigationSearchLink, NavigationSearchModelLink } from '../api/types' -import { getModelChatLinks, getModelMediaLinks } from '../api/api-get-model-links' import { uniqueId } from 'lodash' import { useSession } from 'next-auth/react' +import { getModelChatLinks, getModelMediaLinks } from '../api/api-get-model-links' +import { NavigationSearchLink, NavigationSearchModelLink } from '../api/types' + export const useNavigationSearchChatLinks = () => { const [chatLinks, setChatLinks] = useState([]) @@ -1,9 +1,10 @@ import { useEffect, useMemo, useState } from 'react' -import { NavigationSearchLink, NavigationSearchModelLink } from '../api/types' -import { getModelMediaLinks } from '../api/api-get-model-links' import { uniqueId } from 'lodash' import { useSession } from 'next-auth/react' +import { getModelMediaLinks } from '../api/api-get-model-links' +import { NavigationSearchLink, NavigationSearchModelLink } from '../api/types' + export const useNavigationSearchMediaLinks = () => { const [mediaLinks, setMediaLinks] = useState([]) @@ -1,7 +1,8 @@ import { RefObject, useCallback, useEffect, useMemo, useRef, useState } from 'react' -import { NavigationSearchLink } from '../api/types' import { useRouter } from 'next/router' +import { NavigationSearchLink } from '../api/types' + export const useNavigationSearchModel = (links: NavigationSearchLink[]) => { // state const [search, setSearch] = useState('') @@ -1,5 +1,5 @@ -import { Box, Typography } from '@mui/material' import React from 'react' +import { Box, Typography } from '@mui/material' import styles from './key-for-search.module.scss' @@ -1,15 +1,18 @@ import React, { useEffect, useMemo } from 'react' import { Autocomplete, Box, Stack, TextField, Typography } from '@mui/material' import Image from 'next/image' -import { KeyForSearch } from './key-for-search' -import { useNavigationSearchChatLinks, useNavigationSearchModel } from '../model' -import { staticLinks } from '../config' -import { InputStyleDark, InputStyleLight, useConcat } from '#/shared' -import { useThemeStore } from '#/entities/theme/model/use-theme-store' import { useRouter } from 'next/router' + import { NavigationSearchLink } from '../api/types' +import { staticLinks } from '../config' +import { useNavigationSearchChatLinks, useNavigationSearchModel } from '../model' import { useNavigationSearchMediaLinks } from '../model/use-media-links' +import { KeyForSearch } from './key-for-search' + +import { useThemeStore } from '#/entities/theme/model/use-theme-store' +import { InputStyleDark, InputStyleLight, useConcat } from '#/shared' + interface SearchProps { device: string } @@ -102,9 +102,6 @@ export const Payment: React.FC = ({ device, changeClose }) setSelectedOffer(uid)} key={offer.uid} /> ) @@ -1,11 +1,13 @@ import React from 'react' +import { IOffer } from '../model/payment' + import styles from './offer.module.scss' -import { CommonBagde } from '#/shared/ui/badge' + import LightningSvg from '#/assets/svg/lightning.svg?react' -import { CommonButton } from '#/shared/ui/button' import { c, commaSeparated } from '#/shared/lib/helpers' -import { IOffer } from '../model/payment' +import { CommonBagde } from '#/shared/ui/badge' +import { CommonButton } from '#/shared/ui/button' interface IOfferProps extends IOffer { pay: (uid: string) => void @@ -1,7 +1,10 @@ import React from 'react' import { Box, Typography } from '@mui/material' + import { previewMessages } from '../config' + import styles from './preview-view.module.scss' + import { c } from '#/shared' import { CommonBagde } from '#/shared/ui/badge' @@ -5,9 +5,9 @@ import { useRouter } from 'next/router' import { useSession } from 'next-auth/react' import { useThemeStore } from '#/entities/theme/model/use-theme-store' +import { useUserStore } from '#/entities/user-account' import { API_HOST } from '#/shared/lib/constants' import { useShowDataStore } from '#/shared/lib/hooks/use-show-data' -import { useUserStore } from '#/entities/user-account' interface IProps { device: 'desktop' | 'mobile' } @@ -24,12 +24,13 @@ import { Tooltip, } from 'chart.js' -import { useStats } from '#/features/use-stats/use-stats' -import { useBalanceStore } from '#/entities/balance/model/use-balance-store' import styles2 from '#/app/styles/account.module.css' import styles from '#/app/styles/styles-pages/index-styles.module.scss' -import { DoughnutOptions, lineOptions } from '#/shared' + +import { useBalanceStore } from '#/entities/balance/model/use-balance-store' import { useUserStore } from '#/entities/user-account' +import { useStats } from '#/features/use-stats/use-stats' +import { DoughnutOptions, lineOptions } from '#/shared' const BorderLinearProgress = styled(LinearProgress)(({ theme }) => ({ height: 18, @@ -162,7 +163,7 @@ export const Statistics = (props: any) => { Расходы по дням - {(statsByDays as any).labels?.length === 0 ? ( + {!statsByDays || (statsByDays as any).labels?.length === 0 ? ( ) : ( @@ -181,7 +182,7 @@ export const Statistics = (props: any) => { Расходы по категориям - {(statsByDays as any).labels?.length === 0 ? ( + {!statsByType || (statsByType as any).labels?.length === 0 ? ( ) : ( @@ -209,7 +210,7 @@ export const Statistics = (props: any) => { Расходы по моделям - {(statsByDays as any).labels?.length === 0 ? ( + {!statsByModel || (statsByModel as any).labels?.length === 0 ? ( ) : ( @@ -2,11 +2,11 @@ import React, { memo } from 'react' import { Box } from '@mui/material' import dayjs, { Dayjs } from 'dayjs' +import StatsFilters from '../ui/stats-filters' + import { Group, Product, Stats } from '#/features/get-admin-stats' import { IProps } from '#/shared/lib/types/entities' -import StatsFilters from '../ui/stats-filters' - export const StatsField: React.FC = memo(({ device, token, theme }) => { const [startDate, setStartDate] = React.useState(dayjs('2023-05-27')) @@ -1,7 +1,7 @@ import React from 'react' import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown' -import KeyboardArrowUpIcon from '@mui/icons-material/KeyboardArrowUp' import SvgIcon from '@mui/icons-material/KeyboardArrowDown' +import KeyboardArrowUpIcon from '@mui/icons-material/KeyboardArrowUp' interface ArrowUpOrDownProps extends React.ComponentProps { directionY: boolean @@ -1,9 +1,9 @@ import axios, { AxiosResponse } from 'axios' -import { API_URL } from '#/shared/lib/constants' - import { WhisperResponse } from '../ui/whisper/whisper' +import { API_URL } from '#/shared/lib/constants' + export const getAudioList = async (token: string) => { try { const { data } = await axios.get(API_URL + '/ml_models/whisper', { @@ -2,12 +2,12 @@ import React, { useState } from 'react' import { Box, Typography } from '@mui/material' import Image from 'next/image' -import { WhisperResponse } from '#/widgets/whisper/ui/whisper/whisper' - import { sliceAudioLink } from '../../lib/helpers' import styles from './card.module.scss' +import { WhisperResponse } from '#/widgets/whisper/ui/whisper/whisper' + interface ICard { remove: (uid: string) => void } @@ -1,4 +1,4 @@ -import * as Sentry from "@sentry/nextjs"; +import * as Sentry from '@sentry/nextjs'; Sentry.init({ dsn: process.env.NEXT_PUBLIC_SENTRY_DSN, @@ -43,6 +43,7 @@ "@mui/x-date-pickers": "^6.6.0", "@next/bundle-analyzer": "^13.4.3", "@react-input/mask": "^2.0.4", + "@reduxjs/toolkit": "^2.8.2", "@sentry/nextjs": "^9.12.0", "@sentry/webpack-plugin": "^3.3.1", "@testing-library/user-event": "^14.6.1",