Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in
Toggle navigation
H
Homework83_M11
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Ли Джен Сеп
Homework83_M11
Commits
2078e52e
Commit
2078e52e
authored
Dec 20, 2024
by
Ли Джен Сеп
💬
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
#6
рефакторю код. соеденил фронт и бек
parent
6ab37d66
Show whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
296 additions
and
299 deletions
+296
-299
.prettierrc
frontend/.prettierrc
+6
-6
Header.tsx
frontend/src/app/components/Header/Header.tsx
+17
-0
InputField.tsx
frontend/src/app/components/InputField.tsx
+51
-50
layout.tsx
frontend/src/app/layout.tsx
+12
-12
page.tsx
frontend/src/app/page.tsx
+138
-156
requestSlice.ts
frontend/src/features/requestSlice.ts
+58
-65
axiosClient.ts
frontend/src/helpers/axiosClient.ts
+2
-4
hooks.ts
frontend/src/store/hooks.ts
+3
-3
store.ts
frontend/src/store/store.ts
+3
-3
main.ts
service/src/main.ts
+6
-0
No files found.
frontend/.prettierrc
View file @
2078e52e
{
{
"semi": true,
"semi": true,
"singleQuote": true,
"singleQuote": true,
"tabWidth": 2
,
"tabWidth": 3
,
"trailingComma": "es5",
"trailingComma": "es5",
"printWidth": 8
0
"printWidth": 14
0
}
}
frontend/src/app/components/Header/Header.tsx
0 → 100644
View file @
2078e52e
import
{
Typography
}
from
'@mui/material'
;
export
function
Header
()
{
return
(
<
Typography
variant=
"h3"
sx=
{
{
fontSize
:
{
xs
:
'24px'
,
sm
:
'36px'
,
},
}
}
>
Cypher Coder/Decoder
</
Typography
>
);
}
frontend/src/app/components/InputField.tsx
View file @
2078e52e
import
{
Grid2
,
TextField
,
Typography
}
from
"@mui/material"
;
import
{
Grid2
,
TextField
,
Typography
}
from
'@mui/material'
;
import
{
ChangeEvent
}
from
"react"
;
import
{
ChangeEvent
}
from
'react'
;
interface
Props
{
interface
Props
{
name
:
"Decoded"
|
"Encoded"
|
"Password"
;
name
:
'Decoded'
|
'Encoded'
|
'Password'
;
value
:
string
;
value
:
string
;
onChange
:
(
e
:
ChangeEvent
<
HTMLInputElement
>
)
=>
void
;
onChange
:
(
e
:
ChangeEvent
<
HTMLInputElement
>
)
=>
void
;
}
}
export
default
function
InputField
({
name
,
value
,
onChange
}:
Props
)
{
export
default
function
InputField
({
name
,
value
,
onChange
}:
Props
)
{
let
labelText
:
string
=
""
;
let
labelText
:
string
=
''
;
switch
(
name
)
{
switch
(
name
)
{
case
"Decoded"
:
case
'Decoded'
:
labelText
=
`Decoded message`
;
labelText
=
`Decoded message`
;
break
;
break
;
case
"Encoded"
:
case
'Encoded'
:
labelText
=
`Encoded message`
;
labelText
=
`Encoded message`
;
break
;
break
;
case
"Password"
:
case
'Password'
:
labelText
=
""
;
labelText
=
''
;
break
;
break
;
default
:
default
:
break
;
break
;
...
@@ -31,8 +31,8 @@ export default function InputField({ name, value, onChange }: Props) {
...
@@ -31,8 +31,8 @@ export default function InputField({ name, value, onChange }: Props) {
htmlFor=
{
`${name}-input`
}
htmlFor=
{
`${name}-input`
}
sx=
{
{
sx=
{
{
fontSize
:
{
fontSize
:
{
xs
:
"16px"
,
xs
:
'16px'
,
sm
:
"20px"
,
sm
:
'20px'
,
},
},
}
}
}
}
>
>
...
@@ -40,16 +40,17 @@ export default function InputField({ name, value, onChange }: Props) {
...
@@ -40,16 +40,17 @@ export default function InputField({ name, value, onChange }: Props) {
</
Typography
>
</
Typography
>
</
Grid2
>
</
Grid2
>
<
Grid2
size=
{
name
===
"Password"
?
6
:
8
}
sx=
{
{
"@media (max-width: 900px)"
:
{
width
:
"100%"
}
}
}
>
<
Grid2
size=
{
name
===
'Password'
?
6
:
8
}
sx=
{
{
'@media (max-width: 900px)'
:
{
width
:
'100%'
}
}
}
>
<
TextField
<
TextField
fullWidth
fullWidth
multiline=
{
name
!==
"Password"
}
multiline=
{
name
!==
'Password'
}
rows=
{
name
===
"Password"
?
1
:
6
}
rows=
{
name
===
'Password'
?
1
:
6
}
variant=
"outlined"
variant=
"outlined"
id=
{
`${name}-input`
}
id=
{
`${name}-input`
}
name=
{
name
}
name=
{
name
}
label=
{
name
}
label=
{
name
}
value=
{
value
}
value=
{
value
}
type=
"password"
onChange=
{
onChange
}
onChange=
{
onChange
}
/>
/>
</
Grid2
>
</
Grid2
>
...
...
frontend/src/app/layout.tsx
View file @
2078e52e
"use client"
;
'use client'
;
import
{
store
}
from
"@/store/store"
;
import
{
store
}
from
'@/store/store'
;
import
{
Provider
}
from
"react-redux"
;
import
{
Provider
}
from
'react-redux'
;
export
default
function
RootLayout
({
export
default
function
RootLayout
({
children
,
children
,
...
...
frontend/src/app/page.tsx
View file @
2078e52e
'use client'
;
'use client'
;
import
{
ChangeEvent
,
useEffect
,
useState
}
from
'react'
;
import
{
Box
,
Button
,
Container
,
Grid2
,
Typography
}
from
'@mui/material'
;
import
{
Box
,
Button
,
Container
,
Grid2
,
Typography
}
from
'@mui/material'
;
import
ArrowDownwardIcon
from
'@mui/icons-material/ArrowDownward'
;
import
ArrowDownwardIcon
from
'@mui/icons-material/ArrowDownward'
;
import
{
ChangeEvent
,
useEffect
,
useState
}
from
'react'
;
import
InputField
from
'./components/InputField'
;
import
InputField
from
'./components/InputField'
;
import
'@/animations/Loader.css'
;
import
'@/animations/Loader.css'
;
import
{
useAppDispatch
,
useAppSelector
}
from
'@/store/hooks'
;
import
{
useAppDispatch
,
useAppSelector
}
from
'@/store/hooks'
;
import
{
Header
}
from
'./components/Header/Header'
;
import
{
encodeMessage
,
decodeMessage
}
from
'@/features/requestSlice'
;
import
{
encodeMessage
,
decodeMessage
}
from
'@/features/requestSlice'
;
interface
IFormData
{
interface
IFormData
{
...
@@ -28,12 +30,12 @@ export default function Home() {
...
@@ -28,12 +30,12 @@ export default function Home() {
alert
(
'Please, type in password!'
);
alert
(
'Please, type in password!'
);
return
;
return
;
}
}
if
(
!
formData
.
encoded
.
trim
())
{
alert
(
'Please fill in the "Decoded" field!'
);
return
;
}
dispatch
(
dispatch
(
encodeMessage
({
password
:
formData
.
password
,
message
:
formData
.
decoded
})
encodeMessage
({
password
:
formData
.
password
,
message
:
formData
.
decoded
,
})
);
);
};
};
...
@@ -42,12 +44,12 @@ export default function Home() {
...
@@ -42,12 +44,12 @@ export default function Home() {
alert
(
'Please, type in password!'
);
alert
(
'Please, type in password!'
);
return
;
return
;
}
}
if
(
!
formData
.
decoded
.
trim
())
{
alert
(
'Please fill in the "Decoded" field!'
);
return
;
}
dispatch
(
dispatch
(
decodeMessage
({
password
:
formData
.
password
,
message
:
formData
.
decoded
})
decodeMessage
({
password
:
formData
.
password
,
message
:
formData
.
encoded
,
})
);
);
};
};
...
@@ -70,20 +72,9 @@ export default function Home() {
...
@@ -70,20 +72,9 @@ export default function Home() {
};
};
return
(
return
(
<
div
className=
"App"
>
<
div
className=
"App"
>
<
Container
sx=
{
{
marginTop
:
2
}
}
maxWidth=
"lg"
>
<
Container
sx=
{
{
marginTop
:
2
}
}
maxWidth=
"lg"
>
<
Typography
<
Header
/>
variant=
"h3"
sx=
{
{
fontSize
:
{
xs
:
'24px'
,
sm
:
'36px'
,
},
}
}
>
Cypher Coder/Decoder
</
Typography
>
<
Box
<
Box
sx=
{
{
sx=
{
{
maxWidth
:
{
maxWidth
:
{
...
@@ -97,11 +88,7 @@ export default function Home() {
...
@@ -97,11 +88,7 @@ export default function Home() {
padding=
{
2
}
padding=
{
2
}
>
>
<
Grid2
container
direction=
"column"
spacing=
{
2
}
>
<
Grid2
container
direction=
"column"
spacing=
{
2
}
>
<
InputField
<
InputField
name=
"Decoded"
value=
{
formData
.
decoded
}
onChange=
{
onInputChangeHandler
}
/>
name=
"Decoded"
value=
{
formData
.
decoded
}
onChange=
{
onInputChangeHandler
}
/>
<
Grid2
<
Grid2
container
container
alignItems=
"center"
alignItems=
"center"
...
@@ -113,26 +100,20 @@ export default function Home() {
...
@@ -113,26 +100,20 @@ export default function Home() {
}
}
}
}
>
>
<
Grid2
size=
{
7
}
>
<
Grid2
size=
{
7
}
>
<
InputField
<
InputField
name=
"Password"
value=
{
formData
.
password
}
onChange=
{
onInputChangeHandler
}
/>
name=
"Password"
value=
{
formData
.
password
}
onChange=
{
onInputChangeHandler
}
/>
</
Grid2
>
</
Grid2
>
<
Grid2
container
>
<
Grid2
container
>
<
Grid2
>
<
Grid2
>
<
Button
<
Button
size=
"small"
variant=
"contained"
startIcon=
{
<
ArrowDownwardIcon
/>
}
onClick=
{
onDecypherHandler
}
>
size=
"small"
variant=
"contained"
startIcon=
{
<
ArrowDownwardIcon
/>
}
onClick=
{
onDecypherHandler
}
>
<
Typography
<
Typography
sx=
{
{
sx=
{
{
display
:
{
xs
:
'none'
,
md
:
'inline'
},
display
:
{
xs
:
'none'
,
md
:
'inline'
,
},
}
}
}
}
>
>
En
code
De
code
</
Typography
>
</
Typography
>
</
Button
>
</
Button
>
</
Grid2
>
</
Grid2
>
...
@@ -143,28 +124,29 @@ export default function Home() {
...
@@ -143,28 +124,29 @@ export default function Home() {
variant=
"contained"
variant=
"contained"
startIcon=
{
startIcon=
{
<
ArrowDownwardIcon
<
ArrowDownwardIcon
sx=
{
{
transform
:
'rotate(180deg)'
}
}
sx=
{
{
transform
:
'rotate(180deg)'
,
}
}
/>
/>
}
}
onClick=
{
onCypherHandler
}
onClick=
{
()
=>
onCypherHandler
()
}
>
>
<
Typography
<
Typography
sx=
{
{
sx=
{
{
display
:
{
xs
:
'none'
,
md
:
'inline'
},
display
:
{
xs
:
'none'
,
md
:
'inline'
,
},
}
}
}
}
>
>
De
code
En
code
</
Typography
>
</
Typography
>
</
Button
>
</
Button
>
</
Grid2
>
</
Grid2
>
</
Grid2
>
</
Grid2
>
</
Grid2
>
</
Grid2
>
<
InputField
<
InputField
name=
"Encoded"
value=
{
formData
.
encoded
}
onChange=
{
onInputChangeHandler
}
/>
name=
"Encoded"
value=
{
formData
.
encoded
}
onChange=
{
onInputChangeHandler
}
/>
</
Grid2
>
</
Grid2
>
</
Box
>
</
Box
>
...
...
frontend/src/features/requestSlice.ts
View file @
2078e52e
import
{
createSlice
,
createAsyncThunk
}
from
'@reduxjs/toolkit'
;
import
{
createSlice
,
createAsyncThunk
}
from
'@reduxjs/toolkit'
;
import
axiosClient
from
'@/helpers/axiosClient'
;
import
{
axiosClient
}
from
'@/helpers/axiosClient'
;
interface
RequestState
{
interface
RequestState
{
loading
:
boolean
;
loading
:
boolean
;
...
@@ -18,33 +18,26 @@ const initialState: RequestState = {
...
@@ -18,33 +18,26 @@ const initialState: RequestState = {
result
:
''
,
result
:
''
,
};
};
export
const
encodeMessage
=
createAsyncThunk
(
export
const
encodeMessage
=
createAsyncThunk
(
'request/encode'
,
async
(
newMessage
:
IData
)
=>
{
'request/encode'
,
async
(
data
:
IData
)
=>
{
try
{
try
{
const
response
=
await
axiosClient
.
post
(
'/encode'
,
data
);
const
{
data
}
=
await
axiosClient
.
post
(
'/encode'
,
newMessage
);
return
response
.
data
.
encoded
;
console
.
log
(
data
);
return
data
.
encoded
;
}
catch
(
error
:
any
)
{
}
catch
(
error
:
any
)
{
throw
new
Error
(
throw
new
Error
(
error
.
response
?.
data
?.
message
||
'Error decoding message'
);
error
.
response
?.
data
?.
message
||
'Error decoding message'
);
}
}
}
);
}
);
export
const
decodeMessage
=
createAsyncThunk
(
export
const
decodeMessage
=
createAsyncThunk
(
'request/decode'
,
async
(
newMessage
:
IData
)
=>
{
'request/decode'
,
async
(
data
:
IData
)
=>
{
try
{
try
{
const
response
=
await
axiosClient
.
post
(
'/decode'
,
data
);
const
{
data
}
=
await
axiosClient
.
post
(
'/decode'
,
newMessage
);
return
response
.
data
.
decoded
;
console
.
log
(
data
);
return
data
.
decoded
;
}
catch
(
error
:
any
)
{
}
catch
(
error
:
any
)
{
throw
new
Error
(
throw
new
Error
(
error
.
response
?.
data
?.
message
||
'Error encoding message'
);
error
.
response
?.
data
?.
message
||
'Error encoding message'
);
}
}
}
});
);
const
requestSlice
=
createSlice
({
const
requestSlice
=
createSlice
({
name
:
'request'
,
name
:
'request'
,
...
@@ -62,7 +55,7 @@ const requestSlice = createSlice({
...
@@ -62,7 +55,7 @@ const requestSlice = createSlice({
})
})
.
addCase
(
encodeMessage
.
rejected
,
(
state
,
action
)
=>
{
.
addCase
(
encodeMessage
.
rejected
,
(
state
,
action
)
=>
{
state
.
loading
=
false
;
state
.
loading
=
false
;
state
.
error
=
action
.
error
.
message
||
"Error occured"
;
state
.
error
=
action
.
error
.
message
||
'Error occured'
;
})
})
.
addCase
(
decodeMessage
.
pending
,
(
state
)
=>
{
.
addCase
(
decodeMessage
.
pending
,
(
state
)
=>
{
state
.
loading
=
true
;
state
.
loading
=
true
;
...
@@ -74,7 +67,7 @@ const requestSlice = createSlice({
...
@@ -74,7 +67,7 @@ const requestSlice = createSlice({
})
})
.
addCase
(
decodeMessage
.
rejected
,
(
state
,
action
)
=>
{
.
addCase
(
decodeMessage
.
rejected
,
(
state
,
action
)
=>
{
state
.
loading
=
false
;
state
.
loading
=
false
;
state
.
error
=
action
.
error
.
message
||
"Error occured"
;
state
.
error
=
action
.
error
.
message
||
'Error occured'
;
});
});
},
},
});
});
...
...
frontend/src/helpers/axiosClient.ts
View file @
2078e52e
import
axios
from
'axios'
;
import
axios
from
'axios'
;
const
axiosClient
=
axios
.
create
({
export
const
axiosClient
=
axios
.
create
({
baseURL
:
'https://localhost/
8000'
,
baseURL
:
'http://localhost:
8000'
,
});
});
export
default
axiosClient
;
frontend/src/store/hooks.ts
View file @
2078e52e
import
{
useDispatch
,
useSelector
}
from
"react-redux"
;
import
{
useDispatch
,
useSelector
}
from
'react-redux'
;
import
type
{
TypedUseSelectorHook
}
from
"react-redux"
;
import
type
{
TypedUseSelectorHook
}
from
'react-redux'
;
import
type
{
RootState
,
AppDispatch
}
from
"./store"
;
import
type
{
RootState
,
AppDispatch
}
from
'./store'
;
export
const
useAppDispatch
:
()
=>
AppDispatch
=
useDispatch
;
export
const
useAppDispatch
:
()
=>
AppDispatch
=
useDispatch
;
export
const
useAppSelector
:
TypedUseSelectorHook
<
RootState
>
=
useSelector
;
export
const
useAppSelector
:
TypedUseSelectorHook
<
RootState
>
=
useSelector
;
frontend/src/store/store.ts
View file @
2078e52e
service/src/main.ts
View file @
2078e52e
...
@@ -6,6 +6,12 @@ ConfigModule.forRoot();
...
@@ -6,6 +6,12 @@ ConfigModule.forRoot();
async
function
startServer
()
{
async
function
startServer
()
{
const
app
=
await
NestFactory
.
create
(
MessageModule
);
const
app
=
await
NestFactory
.
create
(
MessageModule
);
app
.
enableCors
({
origin
:
'http://localhost:666'
,
methods
:
'GET,POST,PUT,DELETE'
,
allowedHeaders
:
'Content-Type,Authorization'
,
credentials
:
true
,
});
await
app
.
listen
(
8000
);
await
app
.
listen
(
8000
);
}
}
startServer
();
startServer
();
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment