Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
196 commits
Select commit Hold shift + click to select a range
28b9ffe
init: create next app 🚀
shd-mn Aug 22, 2024
fff0109
chore: config eslint, prettier, husky and lint-staged
shd-mn Aug 22, 2024
762cbcd
chore: config vitest and other testing lib
shd-mn Aug 22, 2024
505db22
chore: add necessary packages
shd-mn Aug 22, 2024
7333df8
feat: create basic Layout template
shd-mn Aug 22, 2024
7b74e08
feat: create empty pages and files for team
shd-mn Aug 22, 2024
9d7cafb
feat: add basic sign in form
Olitera Aug 22, 2024
ecad1b8
refactor: using material ui nextjs integration
shd-mn Aug 23, 2024
0f910a5
feat: add basic layout for sign in form
Olitera Aug 23, 2024
831bce7
Merge remote-tracking branch 'origin/develop' into auth
Olitera Aug 23, 2024
9d86cfd
feat: add redirect to home page after successful sign in
Olitera Aug 23, 2024
b5d936d
feat: add signup page
Olitera Aug 23, 2024
f34dd23
feat: install and configure firebase
Olitera Aug 23, 2024
ca024d4
feat: integrate auth wih firebase
Olitera Aug 23, 2024
c533acd
Merge pull request #1 from shd-mn/auth
shd-mn Aug 23, 2024
10355df
feat: add private route
Olitera Aug 24, 2024
8e7aaf3
feat: add logout on token expiration
Olitera Aug 25, 2024
97529a2
Merge pull request #2 from shd-mn/private_route
shd-mn Aug 26, 2024
f7ecbc5
feat: add and configure redux-toolkit, codemirror packages
shd-mn Aug 26, 2024
9386a51
feat: fetch data from endpoint base on params
shd-mn Aug 26, 2024
cd6fb03
feat: create fetchData function
shd-mn Aug 26, 2024
c741eca
feat: create response section
shd-mn Aug 26, 2024
3a781c7
feat: create rest-client form
shd-mn Aug 26, 2024
a324156
feat: create InputTable dynamic form for getting variables
shd-mn Aug 26, 2024
ef7be16
feat: create custom tab panel for restfull form
shd-mn Aug 26, 2024
c6b316b
feat: create store and restfullSlice to get form state
shd-mn Aug 26, 2024
e88a558
feat: create useLocalStorage custom hook
shd-mn Aug 26, 2024
083bbf1
feat: create createQueryString util fn encode param for url
shd-mn Aug 26, 2024
1504e6c
Merge pull request #3 from shd-mn/restfull-client
shd-mn Aug 26, 2024
d43664a
Merge branch 'develop' into restfull-client
shd-mn Aug 26, 2024
2369789
Merge pull request #3 from shd-mn/restfull-client
shd-mn Aug 26, 2024
0b04fd3
refactor: useLocalStorage export props individually
shd-mn Aug 27, 2024
2191a0a
feat: add email verification
Olitera Aug 29, 2024
274858d
feat: add toast messages
Olitera Aug 29, 2024
0a631fe
feat: create graphigl component
Olitera Aug 30, 2024
1db550f
feat: add basic graphiql client structure
Olitera Aug 31, 2024
7221887
feat: add opportunity to receve response from basic graphql query
Olitera Aug 31, 2024
ae9d91a
feat: show query response in response section
Olitera Aug 31, 2024
f536190
Merge pull request #4 from shd-mn/auth
Olitera Sep 1, 2024
3fc2ea0
Merge branch 'develop' into graphiql
Olitera Sep 3, 2024
939a363
feat: get graphql schema from url
Olitera Sep 3, 2024
b97fe77
feat: display graphql schema in documentation
Olitera Sep 3, 2024
ae59007
feat: add opportunity to prettify graphql query
Olitera Sep 4, 2024
102422d
refactor: refactor project structure
Olitera Sep 4, 2024
b327fb7
feat: add opportunity to receive responses from queries and mutations
Olitera Sep 4, 2024
c96b9c4
feat: add support variables and headers in query
Olitera Sep 6, 2024
ccbd385
feat: add opportunity to set headers
Olitera Sep 6, 2024
04f79c4
refactor: change graphql route
Olitera Sep 7, 2024
13d71bd
refactor: route name changes
shd-mn Sep 7, 2024
88ce82b
Merge pull request #5 from shd-mn/graphiql
shd-mn Sep 7, 2024
3859c5b
refactor: remove route
shd-mn Sep 7, 2024
c9d4b4b
feat: adding show, filter and delete requests to History route
shd-mn Sep 8, 2024
ee06510
feat: add getComparator for sorting Datatable
shd-mn Sep 8, 2024
6361a58
feat: add MainSlice response state
shd-mn Sep 8, 2024
2684178
Merge branch 'develop' into history-route
shd-mn Sep 8, 2024
2a27e36
Merge pull request #6 from shd-mn/history-route
shd-mn Sep 8, 2024
5b99dae
chore: added Monco-editor, pretty-bytes, react-resizable-panels and p…
shd-mn Sep 8, 2024
452c686
feat: create Resizable components
shd-mn Sep 8, 2024
7fcd3fd
feat: add types
shd-mn Sep 8, 2024
7a6807c
feat: create calcSize util fn for response size
shd-mn Sep 8, 2024
370baac
refactor: restfulSlice added another fields
shd-mn Sep 8, 2024
5ae8a79
refactor: change fetching logic, make sections resizable
shd-mn Sep 8, 2024
c9dbf78
refactor: RestForm use monaco editor, add another fields, save data t…
shd-mn Sep 8, 2024
96a5542
feat: create resonse Section, add section body, head and empty state
shd-mn Sep 8, 2024
a4b6f30
refactor: some changes
shd-mn Sep 8, 2024
3efbaa9
feat: create replace util fn
shd-mn Sep 8, 2024
3c6076e
feat: added fetcher restclient service fn
shd-mn Sep 8, 2024
c4f0028
feat: create generateUrl fn
shd-mn Sep 8, 2024
2fbf7b6
Merge branch 'develop' into restfull-client
shd-mn Sep 8, 2024
6e4265b
Merge pull request #7 from shd-mn/restfull-client
shd-mn Sep 8, 2024
929e5c3
fix: history route
shd-mn Sep 8, 2024
9093f11
refactor: use Link and sooner toast package
shd-mn Sep 9, 2024
8d47ab7
refacor: some changes
shd-mn Sep 9, 2024
d737cce
feat: added team members and course link to footer
shd-mn Sep 9, 2024
410e9aa
refactor: PrivateRoute logic for public routes handling and improved …
shd-mn Sep 9, 2024
87c7909
refactor: remove custom Toast comp and toast slice
shd-mn Sep 9, 2024
71e1211
fix: show toast message when route change
shd-mn Sep 9, 2024
7ffcf91
refactor: wrap children with PrivateRoute
shd-mn Sep 9, 2024
a1c97b7
feat: create Loading comp and animated svg
shd-mn Sep 9, 2024
66729f2
feat: add resolve path to vitest config
shd-mn Sep 9, 2024
2f10e95
feat: creat mock setup for next/image
shd-mn Sep 9, 2024
3d8acf2
test: add Ellipsis Component test
shd-mn Sep 9, 2024
58b3d43
refactor: PrivateRoute loading comp
shd-mn Sep 9, 2024
72156ff
Merge pull request #8 from shd-mn/feat/test
shd-mn Sep 9, 2024
534041a
refactor: change login route to signin
shd-mn Sep 9, 2024
14b4de4
fix: add required to endpoint and sdl
Olitera Sep 10, 2024
d002599
fix: fix connection graphql request with response section
Olitera Sep 10, 2024
6e90d62
fix: fix headers in graphiql client
Olitera Sep 10, 2024
12dce37
fix: fix warning
Olitera Sep 11, 2024
46536e6
feat: update url on focus out from query editor
Olitera Sep 11, 2024
427ad0f
fix: set api url query and headers from browser url
Olitera Sep 12, 2024
13ad1e0
fix: fix empty headers
Olitera Sep 12, 2024
1f12924
Merge pull request #9 from shd-mn/graphiql
shd-mn Sep 12, 2024
1963087
style: some improvments, adding dynamic tailwind colors, mui theme
shd-mn Sep 12, 2024
8ab0766
fix: fix titles in forms
Olitera Sep 12, 2024
8fc99cf
feat: add ErrorState comp, show failed fetch error
shd-mn Sep 12, 2024
b108df8
feat: add loading state to main slice and rest form
shd-mn Sep 12, 2024
7e016e9
refactor: add details and make responsive ErrorState
shd-mn Sep 12, 2024
9074592
feat: add table for res headers, some improvment in monaco editor
shd-mn Sep 12, 2024
4618f1d
feat: handle loading, empty, error and succes state in ResponseSection
shd-mn Sep 12, 2024
08cc221
feat: added status colors util fn, remove calcSize util fn
shd-mn Sep 12, 2024
44bdf81
fix: add z-index to ensure proper layering and customizable appearance
shd-mn Sep 12, 2024
4cf3e28
feat: add content type-based response handling
shd-mn Sep 12, 2024
0777dc0
feat: Enhance error message extraction in getErrorMessage
shd-mn Sep 12, 2024
6ec7049
Merge pull request #10 from shd-mn/auth
shd-mn Sep 12, 2024
39ab6a5
Merge branch 'restfull-client' into develop
shd-mn Sep 12, 2024
7e6a85a
refactor: move auth typeto types folder, change login input to email
shd-mn Sep 12, 2024
990b702
refactor: seperate auth toast messages
shd-mn Sep 12, 2024
366335a
Merge pull request #12 from shd-mn/auth
shd-mn Sep 12, 2024
3dcfa9a
refactor: relocate Response Section comp
shd-mn Sep 12, 2024
67e313e
refactor: relocate Table component
shd-mn Sep 12, 2024
e8a359b
refactor: relocate components
shd-mn Sep 12, 2024
13ad04b
refactor: merge slice directories into a single folder structure, fi…
shd-mn Sep 12, 2024
c3110a6
refactor: change types
shd-mn Sep 12, 2024
b3e7c18
fix: deployment type declaration error
shd-mn Sep 12, 2024
28e5de3
chore: uninstall codemirror packages
shd-mn Sep 12, 2024
562a800
refactor: toastMessage urlNotProvided
shd-mn Sep 12, 2024
4de9b3f
Merge pull request #13 from shd-mn/refactor
shd-mn Sep 12, 2024
5fcc5d3
feat: create EmptyHistory component
shd-mn Sep 12, 2024
af23539
refactor: make history comp responsive, remove empty request condition
shd-mn Sep 12, 2024
4691847
Merge pull request #14 from shd-mn/history-route
shd-mn Sep 12, 2024
1da3d7b
feat: add ErrorBoundary comp
shd-mn Sep 12, 2024
27175be
chore: replace jsdom with happy-dom pgk, add some test configuration
shd-mn Sep 12, 2024
4c77e52
test: add useLocalStorage hook test
shd-mn Sep 12, 2024
2c18f31
feat: create custom wrapper for test
shd-mn Sep 12, 2024
c31f514
test: add Home page, and History page test
shd-mn Sep 12, 2024
ccbc76d
Merge pull request #15 from shd-mn/feat/test
shd-mn Sep 12, 2024
210ffd0
chore: configure next Internationalization with next-intl
shd-mn Sep 13, 2024
cc49560
feat: create LanguageSwitcher comp
shd-mn Sep 13, 2024
77350f1
feat: create multi language file
shd-mn Sep 13, 2024
941f065
feat: translate pages and contents except
shd-mn Sep 13, 2024
f12368c
Merge pull request #16 from shd-mn/feature/localization
shd-mn Sep 13, 2024
ca28d6f
test: add next-intl to test-wrapper
shd-mn Sep 13, 2024
677bb8c
Merge pull request #17 from shd-mn/feat/test
shd-mn Sep 13, 2024
f0e9242
test: add Signin page and Signup page test
Olitera Sep 13, 2024
f9fe128
test: add FormSignIn component test
Olitera Sep 13, 2024
72464fd
test: add PrivateRoute test
Olitera Sep 14, 2024
f7364aa
test: add FormSignUp component test
Olitera Sep 14, 2024
59a867e
fix: fix FormSignIn component test
Olitera Sep 14, 2024
6cbcdb1
test: add utils tests
Olitera Sep 14, 2024
a5fe6f1
refactor: fix vitest.config
Olitera Sep 14, 2024
a5faa6d
test: add url-graphgl validation test
Olitera Sep 14, 2024
d1c1dbd
test: add app tests
Olitera Sep 14, 2024
6124977
test: add StoreProvider test
Olitera Sep 14, 2024
603c1b0
test: add redux tests
Olitera Sep 14, 2024
91810fc
Merge branch 'develop' into feat/test
Olitera Sep 14, 2024
0c52e68
test: add service test
Olitera Sep 14, 2024
ab11040
feat: add prettify, json and plan text support for editor, refactor r…
shd-mn Sep 14, 2024
0ef57ba
refactor: some changes for better ui
shd-mn Sep 14, 2024
1f53a4a
test: add Resizable component test
Olitera Sep 14, 2024
2d85e59
test: add DataTable component test
Olitera Sep 14, 2024
d3ce903
Merge pull request #18 from shd-mn/feat/test
shd-mn Sep 14, 2024
4aa3de4
Merge pull request #19 from shd-mn/restfull-client
shd-mn Sep 14, 2024
0d4416c
feat: create Features section
shd-mn Sep 14, 2024
9988181
feat: create Hero section
shd-mn Sep 14, 2024
6c81ed7
feat: create Team section
shd-mn Sep 14, 2024
11a8149
feat: modify and added language support for home page
shd-mn Sep 14, 2024
4a06a0c
fix: welcome message
shd-mn Sep 14, 2024
34f33c7
test: add Footer component test
Olitera Sep 15, 2024
3a74a1d
test: add Response component tests
Olitera Sep 15, 2024
43fd53b
test: add LanguageSwitcher test
Olitera Sep 15, 2024
dd3ba38
test: add Table component tests
Olitera Sep 15, 2024
a009569
test: add graphql page test
Olitera Sep 15, 2024
b5561a3
test: add Documentation test
Olitera Sep 15, 2024
c0fca6c
feat: add show and hide variables to RestClient
shd-mn Sep 15, 2024
6f48457
Merge pull request #20 from shd-mn/restfull-client
shd-mn Sep 15, 2024
8c9d8f7
refactor: replace url variables with actual value
shd-mn Sep 15, 2024
09fe01b
Merge pull request #21 from shd-mn/refactor
shd-mn Sep 15, 2024
5044f2d
feat: add header sticky functionality
Olitera Sep 15, 2024
7294764
Merge remote-tracking branch 'origin/refactor' into refactor
Olitera Sep 15, 2024
42c0ff9
Merge branch 'develop' into feat/test
Olitera Sep 15, 2024
c2bd14d
test: add PrettifyButton test
Olitera Sep 15, 2024
480f471
test: add Header component test
Olitera Sep 15, 2024
7287b24
test: add GraphQL variable editor test
Olitera Sep 15, 2024
ca09a48
test: add RestForm component test
Olitera Sep 15, 2024
f0199d1
test: add rest page test
Olitera Sep 15, 2024
93791a3
refator: Graphql client ui
shd-mn Sep 15, 2024
6666f2c
feat: add language support to graphql page
shd-mn Sep 15, 2024
33d8c69
refactor: add show-hidden button translate
shd-mn Sep 15, 2024
05100a1
Merge pull request #22 from shd-mn/refactor
shd-mn Sep 15, 2024
28d6462
Merge pull request #23 from shd-mn/feat/test
shd-mn Sep 15, 2024
2930546
Merge branch 'refactor' of https://github.com/shd-mn/graphiql-app int…
shd-mn Sep 15, 2024
da30bc7
Merge pull request #24 from shd-mn/refactor
shd-mn Sep 15, 2024
67ce679
refactor: changes monaco editor theme to light
shd-mn Sep 15, 2024
825a145
Merge pull request #25 from shd-mn/refactor
shd-mn Sep 15, 2024
b62f054
test: add firebase test
Olitera Sep 15, 2024
360696f
fix: fix getting data from url
Olitera Sep 15, 2024
1bcedd0
Merge branch 'develop' into graphiql
Olitera Sep 15, 2024
b9fdadc
feat: added videos to features section
shd-mn Sep 15, 2024
160e4b9
Merge pull request #26 from shd-mn/refactor
shd-mn Sep 15, 2024
f192dec
fix: fix documentation
Olitera Sep 15, 2024
a606862
Merge pull request #27 from shd-mn/graphiql
Olitera Sep 15, 2024
7e2dff2
Merge branch 'develop' into feat/test
Olitera Sep 15, 2024
dc7e79d
fix: fix test
Olitera Sep 15, 2024
9fa16da
refactor: fix config
Olitera Sep 15, 2024
fa8f387
Merge pull request #28 from shd-mn/feat/test
Olitera Sep 15, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
[*]
charset = utf-8
insert_final_newline = true
end_of_line = auto
indent_style = space
indent_size = 2
max_line_length = 80
4 changes: 4 additions & 0 deletions .eslintignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
node_modules/
build/
vitest.setup.tsx
coverage/
53 changes: 53 additions & 0 deletions .eslintrc.cjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
module.exports = {
root: true,
env: { browser: true, es2020: true },
extends: [
'eslint:recommended',
'plugin:react/recommended',
'plugin:react/jsx-runtime',
'plugin:@typescript-eslint/recommended',
'plugin:react-hooks/recommended',
'next/core-web-vitals',
'prettier',
'plugin:prettier/recommended',
],
ignorePatterns: ['dist', '.eslintrc.cjs'],
parser: '@typescript-eslint/parser',
parserOptions: {
ecmaVersion: 'latest',
sourceType: 'module',
tsconfigRootDir: __dirname,
ecmaFeatures: {
jsx: true,
},
},
plugins: ['react', 'react-hooks', '@typescript-eslint'],
settings: {
react: {
version: 'detect',
},
},
rules: {
'@typescript-eslint/no-explicit-any': 'error',
'react/jsx-uses-react': 'off',
'react/jsx-uses-vars': 'off',
'react/react-in-jsx-scope': 'off',
'react-hooks/rules-of-hooks': 'error',
'react-hooks/exhaustive-deps': 'warn',
'prettier/prettier': [
'error',
{
endOfLine: 'auto',
},
],
'@typescript-eslint/no-unused-vars': [
'error',
{
vars: 'all',
args: 'after-used',
ignoreRestSiblings: true,
varsIgnorePattern: '_',
},
],
},
};
42 changes: 42 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.

# dependencies
/node_modules
/.pnp
.pnp.js
.yarn/install-state.gz

# testing
/coverage

# next.js
/.next/
/out/

# production
/build

# misc
.DS_Store
*.pem

# debug
npm-debug.log*
yarn-debug.log*
yarn-error.log*

# local env files
.env*.local

# vercel
.vercel

# typescript
*.tsbuildinfo
next-env.d.ts

# WebStorm
.idea

# environment
.env
1 change: 1 addition & 0 deletions .husky/pre-commit
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
npx lint-staged
Empty file added .husky/pre-push
Empty file.
8 changes: 8 additions & 0 deletions .lintstagedrc.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
const path = require('path');

const buildEslintCommand = (filenames) =>
`next lint --fix --file ${filenames.map((f) => path.relative(process.cwd(), f)).join(' --file ')}`;

module.exports = {
'*.{js,jsx,ts,tsx}': [buildEslintCommand],
};
3 changes: 3 additions & 0 deletions .prettierignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
node_modules/
build/
coverage/
9 changes: 9 additions & 0 deletions .prettierrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"semi": true,
"singleQuote": true,
"tabWidth": 2,
"trailingComma": "all",
"endOfLine": "auto",
"printWidth": 120,
"plugins": ["prettier-plugin-tailwindcss"]
}
7 changes: 7 additions & 0 deletions __test__/mock/handlers.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import { http, HttpResponse } from 'msw';

export const handlers = [
http.get('', () => {
return HttpResponse.json('');
}),
];
4 changes: 4 additions & 0 deletions __test__/mock/mockData.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
export const mockRequests = [
{ id: '1', method: 'GET', url: 'https://api.example.com', date: '2023-01-01' },
{ id: '2', method: 'POST', url: 'https://api.test.com', date: '2023-01-02' },
];
4 changes: 4 additions & 0 deletions __test__/mock/server.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import { setupServer } from 'msw/node';
import { handlers } from './handlers';

export const server = setupServer(...handlers);
79 changes: 79 additions & 0 deletions __test__/test-utils.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
import { ReactElement, PropsWithChildren } from 'react';
import { render, RenderOptions } from '@testing-library/react';
import { Provider } from 'react-redux';
import { configureStore, combineReducers } from '@reduxjs/toolkit';
import { ThemeProvider } from '@mui/material/styles';
import theme from '@/theme';
import userEvent from '@testing-library/user-event';
import { mainSlice } from '@/redux/features/mainSlice';
import { graphiqlSlice } from '@/redux/features/graphiqlSlice';
import { restfulSlice } from '@/redux/features/restfulSlice';
import { AbstractIntlMessages, NextIntlClientProvider } from 'next-intl';
import { AppRouterContext } from 'next/dist/shared/lib/app-router-context.shared-runtime';
import enLocale from '../messages/en.json';
import ruLocale from '../messages/ru.json';

const mockUseRouter = {
push: vi.fn(),
replace: vi.fn(),
prefetch: vi.fn(),
back: vi.fn(),
forward: vi.fn(),
refresh: vi.fn(),
pathname: '/',
locale: 'en',
locales: ['en', 'ru'],
route: '/',
};

const rootReducer = combineReducers({
main: mainSlice.reducer,
restful: restfulSlice.reducer,
graphiql: graphiqlSlice.reducer,
});

export function setupStore(preloadedState?: Partial<RootState>) {
return configureStore({
reducer: rootReducer,
preloadedState,
});
}

export type RootState = ReturnType<typeof rootReducer>;
export type AppStore = ReturnType<typeof setupStore>;
export type AppDispatch = AppStore['dispatch'];

interface ExtendedRenderOptions extends Omit<RenderOptions, 'queries'> {
preloadedState?: Partial<RootState>;
store?: AppStore;
locale?: string;
messages?: Record<string, string | AbstractIntlMessages>;
}

export function customRender(ui: ReactElement, extendedRenderOptions: ExtendedRenderOptions = {}) {
const {
preloadedState = {},
store = setupStore(preloadedState),
locale = 'en',
messages = locale === 'en' ? enLocale : ruLocale,
...renderOptions
} = extendedRenderOptions;

const Wrapper = ({ children }: PropsWithChildren) => (
<Provider store={store}>
<ThemeProvider theme={theme}>
<AppRouterContext.Provider value={mockUseRouter}>
<NextIntlClientProvider locale={locale} messages={messages}>
{children}
</NextIntlClientProvider>
</AppRouterContext.Provider>
</ThemeProvider>
</Provider>
);

return {
store,
user: userEvent.setup(),
...render(ui, { wrapper: Wrapper, ...renderOptions }),
};
}
36 changes: 36 additions & 0 deletions app/[locale]/GRAPHQL/[[...endpoint]]/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import ResponseSection from '@/components/Response';
import GraphiQLClient from '@/components/GraphiQLClient';
import { ResizableGroup, ResizableHandle, ResizablePanel } from '@/components/Resizable';
import { base64ToText } from '@/utils/coderBase64';

interface Props {
params?: {
endpoint: string[];
};
searchParams?: Record<string, string>;
}

function GraphQL({ params, searchParams }: Props) {
const responseData = params?.endpoint;
const url = Array.isArray(responseData) && responseData[0] ? base64ToText(responseData[0]?.replace('%3D', '=')) : '';
const query =
Array.isArray(responseData) && responseData[1]
? base64ToText(responseData[1]?.replace('%3D', '='))?.replace(/\\n/g, '\n')
: '';

return (
<main className="h-[calc(100vh-6rem)]">
<ResizableGroup autoSaveId="graphql" direction="vertical">
<ResizablePanel defaultSizePercentage={50} minSizePercentage={15} id="gql-panel">
<GraphiQLClient urlinput={url} queryinput={query} headersinput={searchParams || {}} />
</ResizablePanel>
<ResizableHandle direction="vertical" />
<ResizablePanel defaultSizePercentage={50} minSizePercentage={15}>
<ResponseSection />
</ResizablePanel>
</ResizableGroup>
</main>
);
}

export default GraphQL;
40 changes: 40 additions & 0 deletions app/[locale]/GRAPHQL/[[...endpoint]]/qraphql.test.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
import { screen, render } from '@testing-library/react';
import { describe, it, expect, vi } from 'vitest';
import GraphQL from '../../../../app/[locale]/GRAPHQL/[[...endpoint]]/page';
import { base64ToText } from '../../../../utils/coderBase64';
import '@testing-library/jest-dom';

vi.mock('@/components/GraphiQLClient', () => ({
__esModule: true,
default: () => <div>GraphiQLClient Mock</div>,
}));

vi.mock('@/components/Response', () => ({
__esModule: true,
default: () => <div>ResponseSection Mock</div>,
}));

vi.mock('@/utils/coderBase64', () => ({
base64ToText: vi.fn((input) => input),
}));

describe('GraphQL Component', () => {
it('renders correctly with params and searchParams', () => {
const endpoint = ['aHR0cHM6Ly9hcGkuZXhhbXBsZS5jb20=', 'c2VhcmNoIHRlc3Q='];

render(<GraphQL params={{ endpoint }} searchParams={{ key: 'value' }} />);

expect(screen.getByText('GraphiQLClient Mock')).toBeInTheDocument();
expect(screen.getByText('ResponseSection Mock')).toBeInTheDocument();

expect(base64ToText).toHaveBeenCalledWith('aHR0cHM6Ly9hcGkuZXhhbXBsZS5jb20=');
expect(base64ToText).toHaveBeenCalledWith('c2VhcmNoIHRlc3Q=');
});

it('handles missing params and searchParams gracefully', () => {
render(<GraphQL />);

expect(screen.getByText('GraphiQLClient Mock')).toBeInTheDocument();
expect(screen.getByText('ResponseSection Mock')).toBeInTheDocument();
});
});
28 changes: 28 additions & 0 deletions app/[locale]/StoreProvider.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
'use client';
import { makeStore } from '@/redux/store';
import type { AppStore } from '@/redux/store';
import { setupListeners } from '@reduxjs/toolkit/query';
import type { ReactNode } from 'react';
import { useEffect, useRef } from 'react';
import { Provider } from 'react-redux';

interface Props {
readonly children: ReactNode;
}

export const StoreProvider = ({ children }: Props) => {
const storeRef = useRef<AppStore | null>(null);

if (!storeRef.current) {
storeRef.current = makeStore();
}

useEffect(() => {
if (storeRef.current != null) {
const unsubscribe = setupListeners(storeRef.current.dispatch);
return unsubscribe;
}
}, []);

return <Provider store={storeRef.current}>{children}</Provider>;
};
19 changes: 19 additions & 0 deletions app/[locale]/[...rest]/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import RestForm from '@/components/RestClient';
import ResponseSection from '@/components/Response';
import { ResizableGroup, ResizableHandle, ResizablePanel } from '@/components/Resizable';

export default function RESTful() {
return (
<main className="flex h-[calc(100vh-6rem)]">
<ResizableGroup autoSaveId="restful" direction="vertical">
<ResizablePanel defaultSizePercentage={50} minSizePercentage={20}>
<RestForm />
</ResizablePanel>
<ResizableHandle direction="vertical" />
<ResizablePanel defaultSizePercentage={50} minSizePixels={36}>
<ResponseSection />
</ResizablePanel>
</ResizableGroup>
</main>
);
}
24 changes: 24 additions & 0 deletions app/[locale]/[...rest]/rest.test.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import { screen, render } from '@testing-library/react';
import { describe, it, expect, vi } from 'vitest';

import '@testing-library/jest-dom';
import RESTful from '@/app/[locale]/[...rest]/page';

vi.mock('@/components/RestClient', () => ({
__esModule: true,
default: () => <div>RestForm Mock</div>,
}));

vi.mock('@/components/Response', () => ({
__esModule: true,
default: () => <div>ResponseSection Mock</div>,
}));

describe('RESTful Component', () => {
it('renders correctly', () => {
render(<RESTful />);

expect(screen.getByText('RestForm Mock')).toBeInTheDocument();
expect(screen.getByText('ResponseSection Mock')).toBeInTheDocument();
});
});
Loading