Skip to content

Commit

Permalink
Update to v0.1.0-beta4 (#77)
Browse files Browse the repository at this point in the history
* Feature/game servers (#58)

* Add game server management functionality

This commit introduces the ability to add and delete game servers. It also includes the UI for managing game servers, validation schemas for server attributes, and relevant hooks for server data fetching and manipulation. A skeleton UI component for when server data is loading has also been included.

* Добавлено состояние отключения профиля и обновлён интерфейс серверной карты

В перечисление ProfileState добавлено состояние отключённого профиля. В файле ServerCard добавлено отображение состояний онлайн/офлайн и прогресса загрузки. Также обновлён визуальный стиль карточки сервера.

* Add profile parameter to server deletion process

The GameServerCard and DeleteGameServerDialog components have been updated to now require a profile parameter. The deletion process has been adjusted to now consider this new profile data. This change necessitates some dependency imports updates and refactoring in related files as well.

* Рефакторинг

* Исправление ошибок UX/DX и рефаторинг запросов (#61)

* Исправление ошибок UX

* Исправление ошибок DX

* Рефаторинг запросов

* Рефаторинг запросов

---------

Co-authored-by: vaterentev <vaterentev@icloud.com>

* Add notifications feature and related UI components (#62)

* Add notifications feature

Several new files and modifications have been introduced to set up the notifications feature. This includes the creation of notification services, schemas, and requests, as well as modifying the main layout to include notifications. The notifications view and UI were established and a connection hub for notifications was formed.

* Update notification hooks and display

The `useNotifications` hook was updated for a better handling of notifications data. Notification display was also refined in `NotificationPage` and `Notifications` components to cater to the changes. Additionally, some minor UI adjustments and improvements in labelling were made within various files.

* Рефакторинг

* Выбор билда клиента  (#60)

* Rebase

* Рефакторинг

* Рефакторинг

* Рефакторинг

* Рефакторинг

* Исправление недочётов в уведомлениях

* Рефакторинг

* Рефакторинг

* Орфография и рефакторинг

* Рефакторинг

* Добавлена поддержка GameLoaderOption.FABRIC в CreateProfileForm (#63)

Была расширена логика формы создания профиля для поддержки нового варианта загрузчика игры - GameLoaderOption.FABRIC. Теперь при выборе этого варианта, также активируются соответствующие поля и параметры формы.

* Обновлен интерфейс уведомлений (#65)

Были добавлены новые компоненты в интерфейс уведомлений и улучшен внешний вид уведомлений. Также увеличено количество отображаемых уведомлений с 3 до 10. Добавлен переход на страницу уведомлений при нажатии на каждое из них.

* Fix integration edit texture service (#67)

Пофиксил баг с изменением скинов и плащей

* Исправление запросов для обновлений текстур (#69)

Исправление запросов для обновлений текстур

* Feature/create profile (#70)

* Изменение select на combobox

* Обновление интерфейса формы создания профиля.

В форме создания профиля был осуществлен рефакторинг с использованием нового компонента FormCombobox. Форма была обновлена, для удобства использования был добавлен поиск при выборе версии игры и загрузчика, а также обработка состояния загрузки и ошибок. ФормCombobox был обновлен для более гибкой настройки.

* Изменение текста ошибки в форме создания профиля

Текст ошибки об отсутствии поддержки версии игры загрузчиком был переформулирован для лучшей читаемости и понимания. Это изменение повышает удобство и простоту использования формы создания профиля.

* Рефакторинг

* Добавлено управление версиями Java при сборке (#71)

* Добавлено получение версий Java

Была добавлена новая функция, которая позволяет получить все доступные версии Java. Эта функция используется в хуке useProfiles и доступна через profileService.

* Добавлена возможность загрузки Java-дистрибутива

Была добавлена функция onDownloadJavaDistributive, позволяющая загрузить Java-дистрибутив. Это изменение позволит обновить Java-версию через восстановление профиля. Изменения включают обработку ошибок и сигнал окончания процесса восстановления.

* Обновление функционала для выбора версии Java

Код обновлен, чтобы добавить возможность выбора версии Java при загрузке клиента. Включено использование JavaVersionBaseEntity для того, чтобы обеспечить корректное сохранение выбранной версии. Пользовательский интерфейс обновлен для отображения доступных версий пользователю.

* Обновлена форма выбора версии Java в DownloadClientHub

В форме выбора версии Java были изменены Select элементы на Popover. Изменения также включают сортировку версий, добавление параметра "по умолчанию" и обновление обработки данных формы. Это улучшает пользовательский интерфейс и делает процесс выбора версии более гибким.

* Обновлен вариант выбора версии Java

Внесены изменения во вкладке выбора версии Java в клиентском хабе. Теперь у пользователя есть возможность выбора между установкой дистрибутива по умолчанию или дистрибутива Java. Также изменен показ имен и версий в выпадающем списке выбора версии Java для более гибкого контроля.

* Фикс дублирования "По умолчанию"

* Рефакторинг

* Добавлена проверка подключения к серверу (#72)

* Добавлена проверка подключения к серверу

Была добавлена переменная isConnected, которая позволяет нам узнать, прошло ли подключение к серверу или нет. Теперь, перед выполнением любых действий, происходит проверка этого состояния. Это должно улучшить стабильность работы приложения, предотвратив выполнение действий без установлений подключения.

* Рефакторинг

* Restructure Integrations page layout (#74)

Reorganized the Integrations page to improve readability by grouping related integration cards under distinct headings. Added "Лаунчер" and "Дополнительное" sections to better categorize specific types of integrations. Updated margins and layout for improved user experience.

* Add support for game arguments in profile form (#73)

* Add support for game arguments in profile form

Extended the EditProfileForm component to include a new game arguments field. Modified the ProfileBaseEntity and zod schema to handle the new gameArguments property. Updated the form to correctly display and handle validation errors for the game arguments input.

* Обновлено описание JVM аргументов

Изменил текст описания параметров запуска, уточнив, что речь идет о виртуальной Java машине. Это улучшает ясность и понимание для пользователей.

---------

Co-authored-by: GamerVII-NET <111225722+GamerVII-NET@users.noreply.github.com>

* Добавлен Zustand для управления состоянием профиля (#75)

* Добавлен Zustand для управления состоянием профиля

Добавлен Zustand для управления состоянием компонента профиля. Вызовы теперь обновляют состояние через Zustand, обеспечивая синхронизацию и реактивное обновление интерфейса.

* Удалить useProfileCardStore из Profile.tsx

Удален неиспользуемый импорт useProfileCardStore из Profile.tsx для повышения чистоты кода. Это изменение устраняет мертвый код и улучшает читаемость.

* Remove scheduled trigger from Docker workflow

The cron job for scheduling the Docker package publish workflow has been removed. This change ensures the workflow only triggers on pushes to the master branch, streamlining the publishing process.

* Fix/notifications (#76)

* Обновлена логика уведомлений

Перенесена логика уведомлений в новое хранилище Zustand. Добавлена сортировка уведомлений и функция "Прочитать все". Также добавлен модуль для очистки уведомлений и улучшена работа с вебсокетами.

* Добавление функций очистки уведомлений

Добавлена функция очистки всех уведомлений с использованием useMutation и обновление интерфейса для обработки данных и отображения статуса операций. Также исправлены некоторые стили и добавлена сортировка уведомлений.

* Добавлено скрытие горизонтальной прокрутки в Notification.tsx

Обновлен стиль компонента уведомлений для предотвращения горизонтальной прокрутки. Это улучшит пользовательский интерфейс и предотвратит возможные проблемы с версткой.

* Упорядочил импорты в Notifications.tsx

Привел порядок импортов в соответствии с внутренними стандартами. Это улучшает читабельность и упрощает поддержку кода.

* Добавить компонент очистки уведомлений

В NotificationPage добавлена кнопка для очистки всех уведомлений с использованием компонента ClearNotificationModel. В ClearNotificationModel добавлено свойство className для гибкости стилизации.

* Рефакторинг

* Исправлен build проекта
  • Loading branch information
Scondic authored Aug 11, 2024
1 parent 92e83f9 commit 58234b5
Show file tree
Hide file tree
Showing 33 changed files with 731 additions and 164 deletions.
2 changes: 0 additions & 2 deletions .github/workflows/docker-package-publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,6 @@ name: Docker
# documentation.

on:
schedule:
- cron: '37 19 * * *'
push:
branches: [ "master" ]
# Publish semver tags as releases.
Expand Down
40 changes: 39 additions & 1 deletion package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@
"postcss": "^8",
"prettier": "3.3.2",
"tailwindcss": "^3.4.4",
"typescript": "^5.5.3"
"typescript": "^5.5.3",
"zustand": "^4.5.4"
}
}
12 changes: 12 additions & 0 deletions src/entities/ProfileCard/lib/store.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import { create } from "zustand";
import { EntityState, EntityStateOption } from "@/shared/enums";

interface State {
state: Nullable<EntityState>;
setState: (state: EntityState) => void;
}

export const useProfileCardStore = create<State>((set) => ({
state: null,
setState: (state) => set(() => ({ state })),
}));
5 changes: 4 additions & 1 deletion src/entities/ProfileCard/ui/ProfileCard.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ import {
import defaultProfileIcon from "@/assets/logos/minecraft.png";

import classes from "./styles.module.css";
import { useProfileCardStore } from "@/entities/ProfileCard/lib/store";

interface ProfileCardParams {
profile: ProfileExtendedBaseEntity;
Expand Down Expand Up @@ -68,6 +69,8 @@ export const ProfileCard = ({ profile }: ProfileCardParams) => {
window.location.reload();
};

const { state } = useProfileCardStore();

return (
<div
className={classes["profile-card"]}
Expand Down Expand Up @@ -129,7 +132,7 @@ export const ProfileCard = ({ profile }: ProfileCardParams) => {
{/* Профиль */}
<div className={classes["profile-card__info"]}>
<div className={classes["profile-card__info-state"]}>
<ClientState state={profile.state} />
<ClientState state={state || profile.state} />
</div>
<div className={classes["profile-card__info-icon-wrapper"]}>
<Image
Expand Down
20 changes: 12 additions & 8 deletions src/features/connect-textures-form/ui/ConnectTexturesForm.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -41,15 +41,19 @@ export function ConnectTexturesForm({
});

const onSubmit = async (data: ConnectTexturesFormSchemaType) => {
await mutateAsync({
type: TexturesServiceType.TEXTURES_SERVICE_SKINS,
url: data.url_skins,
});
if (form.getFieldState("url_skins").isDirty) {
await mutateAsync({
type: TexturesServiceType.TEXTURES_SERVICE_SKINS,
url: data.url_skins,
});
}

await mutateAsync({
type: TexturesServiceType.TEXTURES_SERVICE_CLOAKS,
url: data.url_cloaks,
});
if (form.getFieldState("url_cloaks").isDirty) {
await mutateAsync({
type: TexturesServiceType.TEXTURES_SERVICE_CLOAKS,
url: data.url_cloaks,
});
}

onOpenChange(false);
};
Expand Down
60 changes: 22 additions & 38 deletions src/features/create-profile-form/ui/CreateProfileForm.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import { Icons } from "@/shared/ui/icons";
import { Input } from "@/shared/ui/input";
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/shared/ui/select";
import { Textarea } from "@/shared/ui/textarea";
import { FormCombobox } from "@/shared/ui/FormCombobox";

import loaderMinecraft from "@/assets/logos/minecraft.png";
import loaderForge from "@/assets/logos/forge.png";
Expand Down Expand Up @@ -130,7 +131,6 @@ export function CreateProfileForm(props: CreateProfileFormProps) {
<FormMessage>{form.formState.errors.name.message}</FormMessage>
)}
</FormItem>

<FormItem>
<FormLabel>Введите описание сервера</FormLabel>
<FormControl>
Expand All @@ -146,20 +146,15 @@ export function CreateProfileForm(props: CreateProfileFormProps) {
render={({ field }) => (
<FormItem className="flex-1">
<FormLabel>Выберите версию игры</FormLabel>
<FormControl>
<Select onValueChange={field.onChange} defaultValue={field.value}>
<SelectTrigger>
<SelectValue placeholder="Выберите версию игры" />
</SelectTrigger>
<SelectContent>
{versions.data?.map((version: string) => (
<SelectItem key={version} value={version}>
{version}
</SelectItem>
))}
</SelectContent>
</Select>
</FormControl>
<FormCombobox
name={field.name}
value={field.value}
placeholder="Выберите версию игры"
placeholderInputSearch="Поиск версий"
options={versions && versions.data}
isLoading={versions.isLoading}
setValue={form.setValue}
/>
{form.formState.errors.version && (
<FormMessage>{form.formState.errors.version.message}</FormMessage>
)}
Expand Down Expand Up @@ -207,28 +202,17 @@ export function CreateProfileForm(props: CreateProfileFormProps) {
render={({ field }) => (
<FormItem className="flex-1">
<FormLabel>Выберите версию загрузчика</FormLabel>
<FormControl>
<Select
onValueChange={field.onChange}
value={field.value}
disabled={
!form.getFieldState("version").isDirty ||
loaderVersion.isFetching ||
loaderVersion.isError
}
>
<SelectTrigger>
<SelectValue placeholder="Выберите версию загрузчика" />
</SelectTrigger>
<SelectContent>
{loaderVersion.data?.map((loader: string) => (
<SelectItem key={loader} value={loader}>
{loader}
</SelectItem>
))}
</SelectContent>
</Select>
</FormControl>
<FormCombobox
name={field.name}
value={field.value}
placeholder="Выберите версию загрузчика"
placeholderInputSearch="Поиск версии загрузчика"
options={loaderVersion && loaderVersion.data}
description="Данная версия игры не поддерживается загрузчиком"
isError={loaderVersion.isError}
isLoading={!form.getFieldState("version").isDirty || loaderVersion.isFetching}
setValue={form.setValue}
/>
{form.formState.errors.gameLoader && (
<FormMessage>{form.formState.errors.gameLoader.message}</FormMessage>
)}
Expand All @@ -238,7 +222,7 @@ export function CreateProfileForm(props: CreateProfileFormProps) {
)}

<div className="flex justify-end">
<Button disabled={isPending || !form.formState.isDirty}>
<Button disabled={isPending || !form.formState.isDirty || loaderVersion.isError}>
{isPending && <Icons.spinner className="mr-2 h-4 w-4 animate-spin" />}
Создать
</Button>
Expand Down
25 changes: 24 additions & 1 deletion src/features/edit-profile-form/ui/EditProfileForm.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ export const EditProfileForm = (props: EditProfileFormProps) => {
name: profile?.profileName || "",
description: profile?.description || "",
jvmArguments: profile?.jvmArguments || "",
gameArguments: profile?.gameArguments || "",
icon: profile?.iconBase64 || "",
background: profile?.background || "",
},
Expand All @@ -56,6 +57,10 @@ export const EditProfileForm = (props: EditProfileFormProps) => {
formUpdate.append("jvmArguments", body.jvmArguments);
}

if (body.gameArguments) {
formUpdate.append("gameArguments", body.gameArguments);
}

await mutateAsync(formUpdate);

if (form.formState.dirtyFields.name) {
Expand Down Expand Up @@ -98,7 +103,9 @@ export const EditProfileForm = (props: EditProfileFormProps) => {
<div className="grid grid-cols-1 lg:grid-cols-2 gap-x-8">
<div className="flex flex-col gap-y-1 min-w-96 mb-2 lg:mb-0">
<h6 className="text-sm font-bold">Jvm Аргументы</h6>
<p className="text-sm text-gray-700 dark:text-gray-300">Параметры запуска клиента</p>
<p className="text-sm text-gray-700 dark:text-gray-300">
Параметры запуска виртуальной Java машины
</p>
</div>
<div className="flex flex-col gap-y-1 min-w-96 mb-2 lg:mb-0">
<Input
Expand All @@ -111,6 +118,22 @@ export const EditProfileForm = (props: EditProfileFormProps) => {
)}
</div>
</div>
<div className="grid grid-cols-1 lg:grid-cols-2 gap-x-8">
<div className="flex flex-col gap-y-1 min-w-96 mb-2 lg:mb-0">
<h6 className="text-sm font-bold">Game Аргументы</h6>
<p className="text-sm text-gray-700 dark:text-gray-300">Параметры запуска клиента</p>
</div>
<div className="flex flex-col gap-y-1 min-w-96 mb-2 lg:mb-0">
<Input
type="text"
placeholder="Введите ваши game аргументы"
{...form.register("gameArguments")}
/>
{form.formState.errors.gameArguments && (
<FormMessage>{form.formState.errors.gameArguments.message?.toString()}</FormMessage>
)}
</div>
</div>
<div className="flex justify-end">
<Button disabled={isPending || form.formState.disabled || !form.formState.isDirty}>
{isPending && <Icons.spinner className="mr-2 h-4 w-4 animate-spin" />}
Expand Down
Loading

0 comments on commit 58234b5

Please sign in to comment.