48 Commits

Author SHA1 Message Date
Vlad Chikalkin
2836153887
Feature/caching (#117)
* Refactor GraphQL client usage in services to improve consistency

- Replaced direct calls to `getClientWithToken` with a new method `getGraphQLClient` across multiple services, ensuring a unified approach to obtaining the GraphQL client.
- Updated the `BaseService` to manage the GraphQL client instance, enhancing performance by reusing the client when available.

* Refactor UpdateProfile component to use useClientOnce for initial profile update

- Replaced useEffect with useClientOnce to handle the first login profile update more efficiently.
- Removed local state management for hasUpdated, simplifying the component logic.
- Updated localStorage handling to ensure the profile update occurs only on the first login.

* Refactor Apollo Client setup to improve modularity and maintainability

- Introduced a new `createLink` function to encapsulate the link creation logic for Apollo Client.
- Updated `createApolloClient` to utilize the new `createLink` function, enhancing code organization.
- Simplified the handling of authorization headers by moving it to the link configuration.

* Add cache-proxy application with initial setup and configuration

- Created a new cache-proxy application using NestJS, including essential files such as Dockerfile, .gitignore, and .eslintrc.js.
- Implemented core application structure with AppModule, ProxyModule, and ProxyController for handling GraphQL requests.
- Configured caching with Redis and established environment variable management using Zod for validation.
- Added utility functions for query handling and time management, enhancing the application's functionality.
- Included README.md for project documentation and setup instructions.

* Add cache-proxy service to Docker configurations and update deployment workflow</message>

<message>
- Introduced a new cache-proxy service in both `docker-compose.dev.yml` and `docker-compose.yml`, with dependencies on Redis and integration into the web and bot services.
- Updated GitHub Actions workflow to include build and push steps for the cache-proxy image, ensuring it is deployed alongside web and bot services.
- Modified environment variable management to accommodate the cache-proxy, enhancing the overall deployment process.
- Adjusted GraphQL cached URL to point to the cache-proxy service for improved request handling.

* Add health check endpoint and controller to cache-proxy service

- Implemented a new HealthController in the cache-proxy application to provide a health check endpoint at `/api/health`, returning a simple status response.
- Updated the AppModule to include the HealthController, ensuring it is registered within the application.
- Configured a health check in the Docker Compose file for the cache-proxy service, allowing for automated health monitoring.

* Update proxy controller and environment variable for cache-proxy service

- Changed the route prefix of the ProxyController from `/proxy` to `/api` to align with the new API structure.
- Updated the default value of the `URL_GRAPHQL_CACHED` environment variable to reflect the new route, ensuring proper integration with the GraphQL service.

* Update cache proxy configuration for query time-to-live settings

- Increased the time-to-live for `GetCustomer`, `GetOrder`, `GetService`, and `GetSlot` queries to 24 hours, enhancing cache efficiency and performance.
- Maintained the existing setting for `GetSubscriptions`, which remains at 12 hours.

* Enhance subscription management and configuration settings

- Added new query time-to-live settings for `GetSlotsOrders`, `GetSubscriptionPrices`, and `GetSubscriptions` to improve caching strategy.
- Implemented `hasTrialSubscription` method in `SubscriptionsService` to check for trial subscriptions based on user history, enhancing subscription management capabilities.
- Updated GraphQL operations to reflect the change from `getSubscriptionSettings` to `GetSubscriptionSettings`, ensuring consistency in naming conventions.

* fix build

* Refactor subscription settings naming

- Updated the naming of `getSubscriptionSettings` to `GetSubscriptionSettings` in the cache-proxy configuration for consistency with other settings.
2025-10-06 23:26:03 +03:00
vchikalkin
ec3c2869c1 Update bot features and localization
- Added new buttons and messages in Russian localization for improved user interaction.
- Integrated '@grammyjs/menu' version 1.3.1 to enhance menu functionality.
- Refactored bot command handlers to streamline conversation flows and improve code organization.
- Updated the main menu structure to include new options for adding contacts and subscription information.
2025-09-18 18:09:35 +03:00
Vlad Chikalkin
363fce4499
Feature/pro subscription (#103)
* feat(profile): add subscription information to profile page

- Integrated `SubscriptionInfoBar` component into the profile page for displaying subscription details.
- Updated GraphQL types to include subscription-related fields and filters.
- Enhanced the profile data management by adding subscription handling capabilities.
- Added a new utility function `getRemainingDays` to calculate remaining days until a specified date.

* refactor(tests): remove BOT_TOKEN from environment mocks in order and slots tests

- Eliminated the hardcoded BOT_TOKEN from the environment mock in both orders.test.js and slots.test.js to streamline test configurations and improve security practices.

* feat(env): add BOT_URL to environment variables and update related configurations

- Introduced BOT_URL to the environment schema for enhanced configuration management.
- Updated turbo.json to include BOT_URL in the environment variables list.
- Modified subscription-bar.tsx to improve user messaging for subscription availability.

* feat(pro-page): use next/link

* feat(pro-page): enhance subscription messaging and add benefits section

- Updated subscription status messaging for clarity and conciseness.
- Improved button styling based on trial availability.
- Added a new benefits section for non-active subscribers, highlighting key features of the Pro subscription.

* fix(pro-page): adjust hero section layout for improved visual consistency

- Reduced margin in the hero section to enhance alignment and overall aesthetics of the Pro page.

* feat(subscriptions): add trial subscription functionality

- Implemented `createTrialSubscription` action in the API for initiating trial subscriptions.
- Enhanced the Pro page to include a `TryFreeButton` for users to activate their trial.
- Updated GraphQL operations and types to support trial subscription features.
- Improved subscription messaging and user experience across relevant components.

* refactor(pro-page): streamline ProPage layout and improve bottom navigation visibility

- Consolidated the main container for the ProPage to enhance layout consistency.
- Updated the BottomNav component to conditionally hide on the Pro page, improving navigation clarity for users.

* feat(subscriptions): add trial period validation for subscriptions

- Implemented a check to verify if a user has already utilized their trial period before allowing access to subscription services.
- Enhanced error handling to provide a clear message when a trial period has been previously used, improving user experience and subscription management.

* style(pro-page, subscription-bar): enhance dark mode support and improve styling consistency

- Updated gradient backgrounds in ProPage and SubscriptionInfoBar to support dark mode variations.
- Refactored class names for better conditional styling based on subscription activity.
- Improved text color handling for better readability in both active and inactive states.

* feat(orders, subscriptions): implement banned user checks and improve remaining orders calculation

- Added `checkIsBanned` method calls in the `createOrder`, `getOrder`, `getOrders`, and `updateOrder` methods of the `OrdersService` to prevent actions from banned users.
- Updated the calculation of `remainingOrdersCount` in the `SubscriptionsService` to ensure it does not go below zero, enhancing subscription management accuracy.

* feat(subscriptions): enhance error handling with centralized error messages

- Introduced a centralized `ERRORS` object in the `subscriptions.ts` file to standardize error messages related to trial subscriptions.
- Updated error handling in the `createSubscription` method to utilize the new error messages, improving maintainability and clarity for subscription-related errors.

* feat(orders): implement order limit checks for clients and masters

- Added order limit validation in the `OrdersService` to check if a master has reached their monthly order limit.
- Introduced new error messages for exceeding order limits, enhancing user feedback for both clients and masters.
- Integrated `SubscriptionsService` to manage subscription status and remaining order counts effectively.

* order-card: fix order_number badge overlays navigation bar

* fix(docker-compose): update healthcheck endpoint to include API path

* feat(profile): add MasterServicesList component to display services for profile masters

- Introduced the MasterServicesList component to show services associated with a master profile.
- Updated ProfilePage to conditionally render MasterServicesList based on user role.
- Refactored services fetching logic into a new useMasterServices hook for better reusability.

* feat(profile): conditionally render SubscriptionInfoBar based on user role

- Updated ProfilePage to check if the user is a master and conditionally render the SubscriptionInfoBar component.
- Refactored customer fetching logic to include a utility function for determining user role.

* fix tests

* fix(typo): rename updateSlot to updateOrder for clarity

* refactor(contact): remove customer master role checks and simplify contact addition

- Updated the `addContact` function to allow all users to add contacts, removing the previous restriction that only masters could do so.
- Deleted the `become-master` feature and related utility functions, streamlining the codebase.
- Adjusted command settings to reflect the removal of the master role functionality.
- Refactored components and hooks to eliminate dependencies on the master role, enhancing user experience and simplifying logic.

* refactor(contacts): rename masters to invited and update related functionality

- Changed the terminology from "masters" to "invited" and "invitedBy" across the codebase for clarity and consistency.
- Updated the `addContact` function to reflect the new naming convention.
- Refactored API actions and server methods to support the new invited structure.
- Adjusted components and hooks to utilize the updated invited data, enhancing user experience and simplifying logic.

* feat(profile): enhance user role checks in subscription and links components

- Added conditional rendering in SubscriptionInfoBar and LinksCard to hide components for users with the Client role.
- Updated ProfileDataCard to use Enum_Customer_Role for role management.
- Improved error handling in OrdersService to differentiate between master and client order limit errors.

* refactor(contacts): update grid components and improve customer role handling

- Renamed InvitedByGrid to MastersGrid and InvitedGrid to ClientsGrid for clarity.
- Enhanced customer role checks by using documentId for identifying the current user.
- Updated the contacts passed to grid components to reflect the new naming and role structure.
- Adjusted titles in grid components for better user experience.

* feat(order): enhance order initialization logic with additional client selection step

- Added a new step for client selection in the order initialization process when only a masterId is present.
- Disabled cognitive complexity checks for improved code maintainability.

* feat(contacts): add showServices prop to ContactRow for conditional rendering

- Updated ContactsList to pass showServices prop to ContactRow.
- Modified ContactRow to conditionally render services based on the showServices prop, enhancing the display of contact information.

* feat(contacts): add DataNotFound component for empty states in contacts and services grids

- Integrated DataNotFound component to display a message when no contacts or services are found in the respective grids.
- Enhanced loading state handling in ServicesSelect and ScheduleCalendar components to improve user experience during data fetching.

* feat(contacts): enhance contact display and improve user experience

- Updated ContactsList to include a description prop in ContactRow for better service representation.
- Renamed header in OrderContacts from "Контакты" to "Участники" for clarity.
- Replaced Avatar components with UserAvatar in various components for consistent user representation.
- Filtered active contacts in MastersGrid and ClientsGrid to improve data handling.
- Adjusted customer query logic to ensure proper handling of telegramId.

* feat(customers): add getCustomers API and enhance customer queries

- Introduced getCustomers action and corresponding server method to fetch customer data with pagination and sorting.
- Updated hooks to support infinite querying of customers, improving data handling in components.
- Refactored ContactsList and related components to utilize the new customer fetching logic, enhancing user experience.
- Adjusted filter labels in dropdowns for better clarity and user understanding.

* refactor(contacts): consolidate customer queries and enhance contact handling

- Replaced use of useCustomersInfiniteQuery with a new useContactsInfiniteQuery hook for improved data fetching.
- Simplified ContactsList and MastersGrid components by removing unnecessary customer documentId filters.
- Deleted outdated contact-related hooks and queries to streamline the codebase.
- Enhanced loading state management across components for better user experience.

* fix(avatar): update UserAvatar sizes for consistency across components

- Changed UserAvatar size from 'xl' to 'lg' in PersonCard for better alignment with design.
- Adjusted UserAvatar size from 'sm' to 'xs' in OrderCard to ensure uniformity in avatar presentation.
- Updated sizeClasses in UserAvatar component to reflect the new 'xs' size, enhancing responsiveness.

* fix(auth): ensure telegramId is a string for consistent handling

- Updated the signIn calls in both Auth and useAuth functions to convert telegramId to a string.
- Modified the JWT callback to store telegramId as a string in the token.
- Enhanced session handling to correctly assign telegramId from the token to the session user.
- Added type definitions for telegramId in next-auth to ensure proper type handling.

* fix(auth): handle unregistered users in authentication flow

- Updated the authentication logic in both Auth and useAuth functions to redirect unregistered users to the '/unregistered' page.
- Enhanced error handling in the authOptions to check for user registration status using the Telegram ID.
- Improved the matcher configuration in middleware to exclude the '/unregistered' route from authentication checks.

* feat(subscriptions): add SubscriptionRewardFields and update related types

- Introduced SubscriptionRewardFields fragment to encapsulate reward-related data for subscriptions.
- Updated CustomerFiltersInput and SubscriptionHistoryFiltersInput to include subscription_rewards for enhanced filtering capabilities.
- Added SubscriptionRewardFiltersInput and SubscriptionRewardInput types to support reward management in subscriptions.
- Modified existing fragments and queries to reflect the new structure and ensure consistency across the codebase.

* test payment

* feat(subscriptions): refactor subscription handling and update related queries

- Renamed `hasUserTrialSubscription` to `usedTrialSubscription` for clarity in the SubscriptionsService.
- Updated subscription-related queries and fragments to use `active` instead of `isActive` for consistency.
- Enhanced the ProPage component to utilize the new subscription checks and improve trial usage logic.
- Removed unused subscription history query to streamline the codebase.
- Adjusted the SubscriptionInfoBar to reflect the new subscription state handling.

* feat(subscriptions): update subscription messages and enhance bot functionality

- Renamed `msg-subscribe-active-until` to `msg-subscription-active-until` for consistency in localization.
- Added `msg-subscription-active-days` to inform users about remaining subscription days.
- Refactored subscription handling in the bot to utilize updated subscription checks and improve user messaging.
- Enhanced conversation flow by integrating chat action for typing indication during subscription interactions.

* feat(subscriptions): enhance subscription handling and localization updates

- Added new message `msg-subscribe-disabled` to inform users when their subscription is disabled.
- Updated `msg-subscription-active-days` to ensure proper localization formatting.
- Refactored subscription command in the bot to check for subscription status and respond accordingly.
- Enhanced ProfilePage to conditionally render the SubscriptionInfoBar based on subscription status.
- Updated GraphQL types and queries to include `proEnabled` for better subscription management.

* feat(bot): enhance conversation handling by removing redundant typing indication

- Added a chat action for 'typing' indication at the start of the bot's conversation flow.
- Removed the redundant 'typing' action from individual conversation handlers to streamline the code.

* feat(localization): update Russian localization with support contact and message adjustments

- Added a new support contact message for user inquiries.
- Refactored existing messages to utilize the new support contact variable for consistency.
- Cleaned up redundant messages and ensured proper localization formatting across various sections.

* feat(localization): add Pro subscription information and update command list

- Introduced new localization entry for Pro subscription information.
- Updated command list to include 'pro' command for better user guidance.
- Enhanced existing subscription messages for clarity and consistency.

* feat(localization): update Pro access terminology and enhance subscription messages

- Replaced instances of "подписка" with "доступ" to clarify Pro access terminology.
- Updated subscription-related messages for improved user understanding and consistency.
- Enhanced command list and bot responses to reflect changes in Pro access messaging.

* feat(subscriptions): enhance subscription flow and localization updates

- Updated default locale to Russian for improved user experience.
- Refactored subscription messages to include expiration dates and active subscription status.
- Enhanced keyboard display for subscription options with clear expiration information.
- Improved handling of subscription-related queries and responses for better clarity.

* update support contact

* update bot description

* .github\workflows\deploy.yml: add BOT_PROVIDER_TOKEN
2025-09-17 14:46:17 +03:00
Vlad Chikalkin
0934417aaf
Fix/rc 1 (#89)
* Revert "packages(apps/web): upgrade next@15.5.0"

This reverts commit 22e4f72ee6e36834672e44a25acf8a5797dcca8c.

* docker-compose: add volumes

* Update Dockerfiles to install specific version of turbo (2.3.2) for consistent dependency management

* .github\workflows\deploy.yml: remove REDIS_PASSWORD env variable

* Update deploy.yml to add REDIS_PASSWORD environment variable for improved configuration management

* Reapply "packages(apps/web): upgrade next@15.5.0"

This reverts commit bcb9be88dfd1b57d6ce6f47bedca4aa3e8db0eae.

* refactor(bot): remove Redis integration from bot configuration

- Eliminated Redis instance and related storage client from the bot's configuration, streamlining the setup and reducing dependencies.
- Updated bot middleware to enhance performance and maintainability.

* Revert "refactor(bot): remove Redis integration from bot configuration"

This reverts commit 4fbbccb0a2967af0c92ff19fe337467347d9a91a.

* docker compose: format

* bot: fix production run (logger problem)

* docker-compose: add app network to redis
2025-08-27 11:37:15 +03:00
Vlad Chikalkin
81fa32c3d2
Release/rc 1 (#87)
* feat(profile): implement local hooks for profile and service data editing

- Added `useProfileEdit` and `useServiceEdit` hooks to manage pending changes and save functionality for profile and service data cards.
- Updated `ProfileDataCard` and `ServiceDataCard` components to utilize these hooks, enhancing user experience with save and cancel options.
- Introduced buttons for saving and canceling changes, improving the overall interactivity of the forms.
- Refactored input handling to use `updateField` for better state management.

* feat(bot): integrate Redis and update bot configuration

- Added Redis service to both docker-compose files for local development and production environments.
- Updated bot configuration to utilize the Grammy framework, replacing Telegraf.
- Implemented graceful shutdown for the bot, ensuring proper resource management.
- Refactored bot commands and removed deprecated message handling logic.
- Enhanced environment variable management for Redis connection settings.
- Updated dependencies in package.json to include new Grammy-related packages.

* fix(registration): improve error handling for customer creation

- Updated error handling in the registration feature to return a generic error message when documentId is not present, enhancing user experience by providing clearer feedback.

* feat(bot): add unhandled command message and integrate unhandled feature

- Introduced a new message for unhandled commands in Russian localization to improve user feedback.
- Integrated the unhandled feature into the bot's middleware for better command handling.

* feat(locales): update Russian localization with additional contact information

- Enhanced the short description in the Russian localization file to include a contact note for user inquiries, improving user support accessibility.

* feat(help): enhance help command with support information

- Updated the help command to include a support message in the Russian localization, providing users with a contact point for inquiries.
- Improved the command response by combining the list of available commands with the new support information, enhancing user experience.

* fix(orders): update default sorting order for orders

- Changed the default sorting order for orders from 'datetime_start:asc' to 'datetime_start:desc' to ensure the most recent orders are displayed first, improving the user experience in order management.

* refactor(orders): remove ClientsOrdersList and streamline OrdersList component

- Eliminated the ClientsOrdersList component to simplify the orders page structure.
- Updated OrdersList to handle both client and master views, enhancing code reusability.
- Improved order fetching logic and UI rendering for better performance and user experience.

* fix(order-form): hide next button on success & error pages

* refactor(bot): streamline bot middleware and improve key generator function

- Removed unused session middleware and sequentialize function from the bot's error boundary.
- Simplified the key generator function for rate limiting by condensing its implementation.
- Enhanced overall code clarity and maintainability in the bot's configuration.

* feat(customer): implement banned customer check and enhance customer data handling

- Added `isCustomerBanned` function to determine if a customer is banned based on the `bannedUntil` field.
- Updated the `BaseService` to throw an error if a banned customer attempts to access certain functionalities.
- Enhanced the GraphQL operations to include the `bannedUntil` field in customer queries and mutations, improving data integrity and user experience.
- Integrated the `CheckBanned` component in the layout to manage banned customer states effectively.

* feat(ban-system): implement multi-level user ban checks across services

- Added a comprehensive ban checking system to prevent access for banned users at multiple levels, including database, API, and client-side.
- Introduced `bannedUntil` field in the customer model to manage temporary and permanent bans effectively.
- Enhanced `BaseService` and various service classes to include ban checks, ensuring that banned users cannot perform actions or access data.
- Updated error handling to provide consistent feedback for banned users across the application.
- Improved user experience with a dedicated ban check component and a user-friendly ban notification page.

* packages(apps/web): upgrade next@15.5.0
2025-08-26 13:23:52 +03:00
Vlad Chikalkin
fde9305632
Fix/bugs features pt 3 (#64)
* chore(docker): add healthcheck to service in docker-compose.yml and update deploy workflow to include docker compose down

* refactor(orders): add useOrdersInfiniteQuery for improved pagination and add load more button in orders list components

* refactor(graphql): remove NotifyService and related notification logic from orders and API, clean up unused dependencies

* refactor(api): streamline customer, order, service, and slot actions by wrapping server functions with client action utility to rethrow error messages to client
2025-07-23 13:15:08 +03:00
Vlad Chikalkin
7bcae12d54
Fix/bugs after first release (#26)
Some checks failed
Build & Deploy Web & Bot / Build and Push to Docker Hub (push) Has been cancelled
Build & Deploy Web & Bot / Deploy to VPS (push) Has been cancelled
* web/packages: upgrade next

* fix(api/orders): update master validation logic to handle optional masters

* fix(api/notify, api/orders): enhance notification messages and update order state handling for masters

* fix react typings

* refactor(order-buttons, action-panel): streamline button handlers and add return functionality

* fix(contacts, orders): replace empty state messages with DataNotFound component for better user feedback

* feat(bot): add share bot command and update environment configuration for BOT_URL

* fix: pnpm-lock.yaml

* feat(bot): implement add contact wizard scene and enhance contact handling logic

* feat(profile): add BookContactButton component to enhance booking functionality

* fix(order-buttons): update cancel and confirm button logic based on order state

* feat(service-select): share services list for all
enhance service card display with duration formatting and improve layout
2025-07-03 16:36:10 +03:00
vchikalkin
7a3dd4688b fix apps/bot build
Some checks failed
Build & Deploy Web & Bot / Build and Push to Docker Hub (push) Has been cancelled
Build & Deploy Web & Bot / Deploy to VPS (push) Has been cancelled
2025-07-02 19:55:15 +03:00
vchikalkin
ecc7b44d6d fix build web with docker compose
Some checks failed
Build & Deploy Web & Bot / Build and Push to Docker Hub (push) Has been cancelled
Build & Deploy Web & Bot / Deploy to VPS (push) Has been cancelled
2025-07-02 17:46:33 +03:00
Vlad Chikalkin
c5799a7f00
Feature/orders (#25)
* add contacts scroller

* add service select

* add calendar & time picker

* context/order: add masterId

* Revert "context/order: add masterId"

This reverts commit d5d07d7b2f5b6673a621a30b00ad087c60675a3f.

* components/order-form: add back button

* disable submit button if no customer selected

* disable submit button if no service selected

* service component: comment span

* save selected date to context

* fix calendar padding

* hooks/slot: rename index -> master

* slot list: render immediately

* fix step components rendering

* add check icon for masters

* Revert "add check icon for masters"

This reverts commit cc81a9a504918ebbffcca8d035c7c4984f109957.

* prepare for split contacts grid into masters/clients grid

* create MastersGrid & master-select step

* optimize useCustomerContacts

* add ClientsGrid & 'client-select' step

* add self to masters list & border avatar

* context/order: split into files

* hooks/profile: allow pass empty args to useProfileQuery/useProfileMutation

* context/order: skip client-select in client steps

* packages: upgrade next@15.3.0

* .vscode: add launch.json

* back-button: fix steps using

* contacts: skip client step for client

* fix react types

* ServiceSelect: fix padding

* Revert "contacts: skip client step for client"

This reverts commit db9af07dab9df9428561a1952f5a2c91c5b9d88d.

* fix steps for client & master

* split datetime-select into files

* improve useSlots hook

* migrate from order context to zustand store

* pass order store via context

* fix submit button not working

* skip master select for master & client select for client

* select time feature & get final order values

* apps/web: rename actions/service -> actions/services

* create order works!

* split next-button into two buttons

* add result pages (success, error)

* packages/graphql: add eslint

* merge branch 'refactor-api' (#23)

* refactor customer api

* refactor slots api

* hooks/customers: use invalidateQueries

* refactor services api

* optimize hooks queryKey

* refactor orders api

* typo refactor hooks

* fix telegramId type (number)

* fix bot with new api

* rename customers masters & clients query

* fix useClientsQuery & useMastersQuery query

* new line after 'use client' & 'use server' directives

* move getAvailableTimeSlots to server

* getAvailableTimeSlots: add filter by orders

* take into service duration when computing times

* fix GetSlotsOrders order

* take into existing orders when computing times

* fix build

* app/orders: fill page with content

* stores/order: split into slices

* components/orders: remove nested components dirs

* move order store -> orders\order-store

* replace ScheduleTimeContext with ScheduleStore

* fix slots queries

* context: rename contexts properly

* finally organized stores & context

* move order-card & time-range to @/components/shared

* Refactor/components folder structure (#24)

* refactor components/navigation

* refactor components/orders

* refactor components/profile

* refactor components/schedule

* remove components/common/spinner

* add launch.json

* add horizontal calendar

* remove context/date.tsx

* optimize orders list fetching

* add numberOfDaysBefore param

* fix orders list in slot page

* graphql/api: remove throw new Error

* horizontal-calendar: switch months by arrow buttons

* SlotCard: use SlotComponentProps type

* stores/schedule: export useScheduleStore

* SlotPage: add page header title

* contacts: mark inactive contacts

* prefetchQuery customer profile pages

* fix create slot

* packages: radash -> radashi

* fix queries, using formatDate & formatTime on client

* graphql: remove rename operations files

* fix create order query

* fix show actual slot status after slot update

* order page

* slot page: replace buttons with floating panel

* fix blur & colors

* fix floating panel overflows content

* hide ClientsOrdersList for non masters

* hooks/services: rename input -> variables

* move OrderCard types close to component

* exact types for Slot components & page

* app/profile: show shared orders

* order-services: fix types

* order page: add buttons

* order-card: add colors

* add order status alert

* fix badges & alerts

* take into account cancelled and completed orders in the slot list

* action panel: hide if no handlers

* highlight days with slots in schedule calendar

* highlight days in horizontal calendar

* remove getSlotsOrders fn

* show masters avatar in orders list

* fix auth redirects

* fix orders list for client

* create useIsMaster hook to prevent duplication

* order: revert cancel button for master

* FloatingActionPanel: block buttons while pending request

* hooks: invalidate orders & slots after mutate & delete

* order: revert approve button for master

* api/orders: protect update order

* order-card: show date

* order-card: add showDate variables in props

* order: add repeat button

* disable dashboard button

* apps/bot: beautify messages

* order: notify to telegram messages

* orderUpdate: add status info
2025-06-27 13:44:17 +03:00
vchikalkin
b418790ae4 packages: upgrade 'eslint-config-awesome'@2.2.2, 'eslint'@9.17.0 2025-02-27 13:24:00 +03:00
vchikalkin
042b3f4308 apps/web: upgrade package 'next'@15.2.0 2025-02-27 12:33:44 +03:00
Vlad Chikalkin
06be87f0ec
Feature/records (#22)
* components/profile: rename components files

* components/profile: organize files & folders

* split DataCard to 2 components

* [2] components/profile: organize files & folders

* data-card: fix phone field disabled

* fix card header color

* add schedule button for master

* fix navigation & profile background

* add basic schedule page

* fix bottom navbar overflows content

* header: remove bottom margin

* replace vanilla calendar with shadcn/ui one

* add slot functional

* fix forbidden error

* add slot operations

* show slots

* filter by selected day

* add hook useSlots
fix update slots list after add slot
fix initial fetch slots

* use slots hooks

* split edit-slot-form into files

* rename /time-slots -> /components

* refactor components & folders structure

* add feature: delete slot

* hooks/slot: update query keys

* add hooks/profile

* add hook useProfileMutation

* use useProfileMutation hook for update role

* rename useProfile -> useProfileQuery

* fix useProfileQuery queryKey

* add hook useContactsQuery

* remove unused ternary operator

* header: add backdrop blur

* create slot cards

* fix elements y center

* fix getSlots filters

* ui/ux improvements

* fix date time types & names

* move profile components from sub folder

* add basic slot page

* fix add slot form padding x

* add slot buttons

* extend slot card information

* fix import type

* use Container in pages

* change orange -> yellow for dark

* use Loading spinner in slots list

* refactor \components\schedule dir structure

* add orders list

* change query & mutation keys

* change url /profile/schedule/slot/ -> /slots/

* order: show services

* remove prefetchQuery

* bring the results of queries and hooks into a single form

* react query: globally show error toast

* add font inter

* fix header: center text

* orders: add sorting

* order card: add avatar

* rename records -> orders

* reduced text size

* fix slot buttons

* fix datetime card ui

* fix header: center text (finally)

* layout/container: last:mb-4

* fix type

* slot-datetime: use ReadonlyTimeRange

* rename files & components

* remove unnecessary context using

* feature: edit slot time

* fix: selected day reset after go back to /schedule

* rename AddTimeRange -> EditableTimeRangeForm & refactor

* fix some elements on page before data loaded

* fix text size

* slot-card: remove gap

* slot-date: remove margin

* fix slots & orders layout

* toast: show error text in ui
2025-02-20 18:11:28 +03:00
vchikalkin
efa6d2138b upgrade packages 2025-01-20 18:16:19 +03:00
Vlad Chikalkin
10b36978fe
Feature/10 contacts (#16)
* apps/bot: add feature add contact

* apps/bot: check role 'master' before add contact

* apps/bot: rename createCustomer -> createUser

* remove ';'

* app/bot: add contact define name & phone

* apps/bot: check user already exists w/o telegramId (invited)

* Чтобы добавить контакт, сначала поделитесь своим номером телефона.

* apps/bot: create or update functions

* apps/bot: remove api.ts -> move getCustomer to packages/graphql/api

* packages/graphql: add api/customer tests

* tests for createOrUpdateClient

* fix(apps/web): user is undefined

* fix(apps/web): actions getCustomer

* feat(apps/web): update user photo on app launch

* rename page 'masters' -> 'contacts'

* feat(apps/web): add basic /contacts page

* fix app layout

* refactor customer queries

* add action getProfile

* get customer contacts

* use zustand for contacts

* add loading spinner

* rename filteredContacts -> contacts

* replace zustand with @tanstack/react-query

* profile: use react-query

* refactor updateRole function

* move updateRole closer to profile-card

* beautify actions

* add page 'profile/[telegramId]'

* profile: add button "message to telegram"

* profile: add call feature

* app/bot: normalize phone before register

* do not open keyboard on page load

* contacts: loading spinner

* telegram login: customer.active=true

* update name on telegram first login
2025-01-20 18:11:33 +03:00
vchikalkin
f4377f160f packages: cleanup catalog 2025-01-10 12:27:44 +03:00
Vlad Chikalkin
b936a79c2b
feature/profile-page (#8)
* add basic profile page

* apps/web: detect telegram/browser
support browser (dev only)

* apps/web: add dark mode

* apps/web: support dark theme in tma

* apps/web: add loading spinner
remove dev info from page

* apps\web\app\(auth)\page.tsx: remove useState

* app/web: handle update profile name

* move debounce functional to hook

* add role checkbox
2025-01-10 11:51:14 +03:00
vchikalkin
9b6df05f4a apps/web: add next-auth 2024-12-24 18:34:50 +03:00
vchikalkin
5d8b2ffc6b move all graphql functional to packages/graphql 2024-12-23 19:07:25 +03:00
vchikalkin
6ec85bd234 pnpx codemod pnpm/catalog 2024-12-23 18:34:01 +03:00
vchikalkin
23e29f90cd apps/bot: add vitest 2024-12-23 18:30:55 +03:00
vchikalkin
1d4584bd6f apps/bot: add create-customer functional 2024-12-22 17:24:32 +03:00
vchikalkin
ab65579ccc pnpx codemod pnpm/catalog 2024-12-17 15:18:42 +03:00
vchikalkin
3f4f47ed8e apps: add bot 2024-12-17 15:13:45 +03:00
vchikalkin
12baf41612 repo: move graphql files to packages/graphql 2024-12-17 12:59:53 +03:00
vchikalkin
c05c77c578 add header 2024-12-16 21:34:02 +03:00
vchikalkin
8169685d6a add navigation
add pages structure
temp disable telegram provider
2024-12-16 18:53:55 +03:00
vchikalkin
2c0b139d35 packages: upgrade next@15.1.0 2024-12-11 16:05:11 +03:00
Vlad Chikalkin
49df4365ca
Feature/telegram integration (#4)
* add files from official template

* remove all official template trash
2024-12-11 16:00:55 +03:00
vchikalkin
db2727bed6 apps/web: add playwright 2024-12-10 18:15:51 +03:00
vchikalkin
2b14158d29 apps/web: add vitest 2024-12-10 17:41:38 +03:00
vchikalkin
80e54ac294 apps/web: support graphql 2024-12-09 18:33:13 +03:00
vchikalkin
aa3ca43730 packages: upgrade 2024-12-09 15:57:33 +03:00
vchikalkin
00e0bb66ff packages: upgrade @vchikalkin/eslint-config-awesome@2.0.5 2024-11-28 11:49:47 +03:00
vchikalkin
1e06d6da23 packages: add lint-staged-config 2024-11-28 11:45:47 +03:00
vchikalkin
b159d811b5 pnpm catalog 2024-11-27 23:28:16 +03:00
vchikalkin
e8dabbb2e5 packages: add lint-staged 2024-11-27 23:22:39 +03:00
vchikalkin
ed239ea830 add husky 2024-11-27 21:24:09 +03:00
vchikalkin
f64818d545 add shadcn/ui 2024-11-27 14:29:35 +03:00
vchikalkin
4b831ec619 pnpm: use catalog 2024-11-27 14:03:52 +03:00
vchikalkin
592e40fef1 packages: fix versions 2024-11-27 13:27:52 +03:00
vchikalkin
4f2cd81dea add new packages 2024-11-27 13:22:49 +03:00
vchikalkin
4b0fea9698 ESLint: add plugin eslint-plugin-tailwindcss 2024-11-26 21:46:54 +03:00
vchikalkin
1cf150c5ba replace tailwind config from examples/with-tailwind 2024-11-26 17:19:01 +03:00
vchikalkin
8959dddb50 packages: add tailwind 2024-11-26 17:08:22 +03:00
vchikalkin
bb1a857993 ESLint: use config @vchikalkin/eslint-config-awesome 2024-11-26 16:38:46 +03:00
Turbobot
b576e0edb7 feat(create-turbo): install dependencies 2024-11-26 15:34:12 +03:00
Turbobot
d61c15e916 feat(create-turbo): create basic 2024-11-26 15:33:59 +03:00