diff --git a/.gitea/workflows/publish.yaml b/.gitea/workflows/publish.yaml new file mode 100644 index 0000000..441b898 --- /dev/null +++ b/.gitea/workflows/publish.yaml @@ -0,0 +1,56 @@ +name: publish-main + +on: + push + +jobs: + release-image: + runs-on: ubuntu-latest + container: + image: catthehacker/ubuntu:act-latest + env: + DOCKER_ORG: krbl + RUNNER_TOOL_CACHE: /toolcache + IMAGE_NAME: minerva-frontend + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Set up QEMU + uses: docker/setup-qemu-action@v2 + + - name: Set up Docker BuildX + uses: docker/setup-buildx-action@v2 + with: + config-inline: | + [registry."gitea.unprism.ru"] + + - name: Login to DockerHub + uses: docker/login-action@v2 + with: + registry: gitea.unprism.ru + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + + - name: Get Meta + id: meta + run: | + echo REPO_NAME=$(echo ${GITHUB_REPOSITORY} | awk -F"/" '{print $2}') >> $GITHUB_OUTPUT + echo REPO_VERSION=$(git describe --tags --always | sed 's/^v//') >> $GITHUB_OUTPUT + + - name: Extract branch name + shell: bash + run: echo "branch=${GITHUB_HEAD_REF:-${GITHUB_REF#refs/heads/}}" >> $GITHUB_OUTPUT + id: extract_branch + + - name: Build and push + uses: docker/build-push-action@v4 + with: + context: . + file: ./Dockerfile + platforms: | + linux/amd64 + linux/arm64 + push: true + tags: | + gitea.unprism.ru/${{ env.DOCKER_ORG }}/${{ env.IMAGE_NAME }}:${{ steps.extract_branch.outputs.branch }} diff --git a/.gitignore b/.gitignore index b465c25..3132af0 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ dist/ node_modules/ -package-lock.json \ No newline at end of file +package-lock.json +.DS_Store diff --git a/captain-definition b/captain-definition new file mode 100644 index 0000000..338a4e5 --- /dev/null +++ b/captain-definition @@ -0,0 +1,12 @@ +{ + "schemaVersion": 2, + "dockerfileLines": [ + "FROM node", + "WORKDIR /app", + "COPY package*.json ./", + "RUN npm install", + "COPY . .", + "EXPOSE 3000", + "CMD [\"npm\", \"run\", \"start:dev\"]" + ] +} diff --git a/src/App.jsx b/src/App.jsx index 7f65446..22b0149 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -3,13 +3,13 @@ import { Outlet, useNavigate } from "react-router-dom"; import { FormsData, UserData, TypeAnswerData, answersData } from "./context"; import { useCookies } from "react-cookie"; import { globalRender } from "./router/protectedRouting.js"; -import { verifyUserApi } from "./hooks/api/enterAccountApi.js" -import classes from "./assets/styles/app.module.scss" +import { verifyUserApi } from "./hooks/api/enterAccountApi.js"; +import classes from "./assets/styles/app.module.scss"; import NavBar from "./components/NavBar.jsx"; -import 'bootstrap/dist/css/bootstrap.min.css'; +import "bootstrap/dist/css/bootstrap.min.css"; import InputText from "./components/typeAnswer/InputText.jsx"; import TextArea from "./components/typeAnswer/TextArea.jsx"; -import YesNo from "./components/typeAnswer/YesNo.jsx" +import YesNo from "./components/typeAnswer/YesNo.jsx"; import InputDate from "./components/typeAnswer/InputDate.jsx"; import InputMultipleRadio from "./components/typeAnswer/InputMultipleRadio.jsx"; import InputRadio from "./components/typeAnswer/InputRadio.jsx"; @@ -32,12 +32,13 @@ const App = () => { {id: 8, text: 'Дата', typeTag: InputDate} ]); - // useEffect(() => globalRender(window.location.pathname, user, navigate)); - const [cookies, _, __] = useCookies(["user"]); + // useEffect(() => globalRender(window.location.pathname, user, navigate)); + const [cookies, _, __] = useCookies(["user"]); - useEffect(() => { - async function verifyUser() { - const response = await verifyUserApi(cookies.token); + useEffect(() => { + async function verifyUser() { + const response = await verifyUserApi(cookies.token); + console.log("app", user); if (response.status === 200) { setUser(response.data); @@ -48,29 +49,31 @@ const App = () => { } } - verifyUser(); - }, []) + verifyUser(); + }, []); - return ( - - - - -
-
-
- -
-
- -
-
-
-
-
-
-
- ) -} + return ( + + + + +
+
+
+ +
+
+ +
+
+
+
+
+
+
+ ); +}; -export default App; \ No newline at end of file +export default App; diff --git a/src/components/NavBar.jsx b/src/components/NavBar.jsx index 75bc149..53947b5 100644 --- a/src/components/NavBar.jsx +++ b/src/components/NavBar.jsx @@ -26,7 +26,7 @@ const NavBar = ({navigate, auth, setAuth}) => { - ) -} + ); +}; -export default NavBar; \ No newline at end of file +export default NavBar; diff --git a/src/hooks/validation/enterAccountValidate.js b/src/hooks/validation/enterAccountValidate.js index 90e6c41..6848325 100644 --- a/src/hooks/validation/enterAccountValidate.js +++ b/src/hooks/validation/enterAccountValidate.js @@ -1,14 +1,18 @@ -const constructorAnswerValidate = (state, messageReject = "Ошибка", messageResolve = undefined) => { - return state ? - { - status: true, - message: messageResolve - } : - { - status: false, - message: messageReject - } -} +const constructorAnswerValidate = ( + state, + messageReject = "Ошибка", + messageResolve = undefined +) => { + return state + ? { + status: true, + message: messageResolve, + } + : { + status: false, + message: messageReject, + }; +}; const totalRegisterValidate = (data) => { const listValidation = [ @@ -22,12 +26,12 @@ const totalRegisterValidate = (data) => { // constructorAnswerValidate(data.password >= 8, "Пароль должен иметь более 8 символов.") ] - for (let value of listValidation) { - if (!value.status) { - return value - } + for (let value of listValidation) { + if (!value.status) { + return value; } - return { status: true } -} + } + return { status: true }; +}; -export { totalRegisterValidate, constructorAnswerValidate } \ No newline at end of file +export { totalRegisterValidate, constructorAnswerValidate }; diff --git a/src/pages/EnterAccount.jsx b/src/pages/EnterAccount.jsx index c244537..6436718 100644 --- a/src/pages/EnterAccount.jsx +++ b/src/pages/EnterAccount.jsx @@ -5,19 +5,23 @@ import classes from "../assets/styles/enterAccount.module.scss"; import MyInput from "../components/MyInput.jsx"; import MyButton from "../components/MyButton.jsx"; import { UserData } from "../context"; -import { logIn, completeRegistration, verifyUserApi } from "../hooks/api/enterAccountApi.js"; +import { + logIn, + completeRegistration, + verifyUserApi, +} from "../hooks/api/enterAccountApi.js"; const EnterAccount = () => { - const [enter, setEnter] = useState("login"); - const navigate = useNavigate(); + const [enter, setEnter] = useState("login"); + const navigate = useNavigate(); - const [email, setEmail] = useState(""); - const [phone, setPhone] = useState(""); - const [login, setLogin] = useState(""); - const [surname, setSurname] = useState(""); - const [patronymic, setPatronymic] = useState(""); - const [password, setPassword] = useState(""); - const [repiedPassword, setRepiedPassword] = useState(""); + const [email, setEmail] = useState(""); + const [phone, setPhone] = useState(""); + const [login, setLogin] = useState(""); + const [surname, setSurname] = useState(""); + const [patronymic, setPatronymic] = useState(""); + const [password, setPassword] = useState(""); + const [repiedPassword, setRepiedPassword] = useState(""); const {user, setUser} = useContext(UserData); const [cookies, setCookie, removeCookie] = useCookies(["user"]); @@ -25,27 +29,27 @@ const EnterAccount = () => { const [loginError, setLoginError] = useState(false); const [regsterError, setRegsterError] = useState(false); - function cleanState() { - setEmail(""); - setPhone(""); - setLogin(""); - setSurname(""); - setPatronymic(""); - setPassword(""); - setRepiedPassword(""); - }; + function cleanState() { + setEmail(""); + setPhone(""); + setLogin(""); + setSurname(""); + setPatronymic(""); + setPassword(""); + setRepiedPassword(""); + } - function selectTag(tag) { - setEnter(tag); - cleanState(); - }; + function selectTag(tag) { + setEnter(tag); + cleanState(); + } - async function createUser() { - const response = await completeRegistration({ - login: login, - password: password, - repiedPassword: repiedPassword - }); + async function createUser() { + const response = await completeRegistration({ + login: login, + password: password, + repiedPassword: repiedPassword, + }); if (response.status === 200) { const responseMe = await verifyUserApi(response.data.token) @@ -59,8 +63,8 @@ const EnterAccount = () => { } }; - async function logInToAccount() { - const response = await logIn(login, password) + async function logInToAccount() { + const response = await logIn(login, password); if (response.status === 200) { setCookie("token", response.data.token); @@ -133,14 +137,19 @@ const EnterAccount = () => { */}
- createUser()}/> + createUser()} + />
- } + + } - ) -} + ); + }; -export default EnterAccount; \ No newline at end of file +export default EnterAccount; diff --git a/src/pages/Home.jsx b/src/pages/Home.jsx index 72adac5..cd11c39 100644 --- a/src/pages/Home.jsx +++ b/src/pages/Home.jsx @@ -1,40 +1,54 @@ import React, { useState } from "react"; -import { useNavigate, useLocation, useParams } from 'react-router-dom'; +import { useNavigate, useLocation, useParams } from "react-router-dom"; import classes from "../assets/styles/home.module.scss"; import MyButton from "../components/MyButton.jsx"; import MyInput from "../components/MyInput.jsx"; const Home = () => { - const [token, setToken] = useState(""); - const navigate = useNavigate(); + const [token, setToken] = useState(""); + const navigate = useNavigate(); - return ( -
-
-
-
Кажется вы попали на общую страницу.
-
Чтобы перейти к форме ввелите токен ниже или снова перейдите по ссылке.
-
-
-
-
-

Перейти к нужной форме

-
-
-
-
- setToken(e)}/> -
-
-
-
- navigate(`/forms/${token}`)}/> -
-
-
-
+ return ( +
+
+
+
+ Кажется вы попали на общую страницу. +
+
+ Чтобы перейти к форме введите токен ниже или снова перейдите по + ссылке. +
- ) -} +
+
+
+

Перейти к нужной форме

+
+
+
+
+ setToken(e)} + /> +
+
+
+
+ navigate(`/forms/${token}`)} + /> +
+
+
+
+
+ ); +}; -export default Home; \ No newline at end of file +export default Home; diff --git a/webpack.config.js b/webpack.config.js index 40ec78b..b940708 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,73 +1,74 @@ -const HtmlWebpackPlugin = require('html-webpack-plugin'); -const MiniCssExtractPlugin = require('mini-css-extract-plugin'); -const path = require('path'); +const HtmlWebpackPlugin = require("html-webpack-plugin"); +const MiniCssExtractPlugin = require("mini-css-extract-plugin"); +const path = require("path"); module.exports = (env) => { + const isDev = env.mode === "development"; - const isDev = env.mode === 'development'; + const cssLoader = { + loader: "css-loader", + options: { + modules: { + localIdentName: isDev ? "[path][name]__[local]" : "[hash:base64:8]", + }, + }, + }; - const cssLoader = { - loader: "css-loader", - options: { - modules: { - localIdentName: isDev ? '[path][name]__[local]' : '[hash:base64:8]' - }, + const config = { + mode: env.mode ?? "development", + performance: { + hints: false, + maxEntrypointSize: 512000, + maxAssetSize: 512000, + }, + entry: "./src/index.js", + output: { + // filename: '[name].[contenthash].js', + filename: "bundle.js", + publicPath: "/", + path: path.resolve(__dirname, "dist"), + clean: true, + }, + plugins: [ + new HtmlWebpackPlugin({ + template: path.resolve(__dirname, "public", "index.html"), + }), + isDev + ? undefined + : new MiniCssExtractPlugin({ + filename: "css/[name].[contenthash:8].css", + chunkFilename: "css/[name].[contenthash:8].css", + }), + ], + module: { + rules: [ + { + test: /\.(scss|css)$/, + use: [ + isDev ? "style-loader" : MiniCssExtractPlugin.loader, + cssLoader, + "sass-loader", + ], }, - } + { + test: /\.(js|jsx)$/, + exclude: /node_modules/, + use: { + loader: "babel-loader", + options: { + presets: ["@babel/preset-env", "@babel/preset-react"], + }, + }, + }, + ], + }, + devServer: { + port: env.port ?? 3000, + historyApiFallback: true, + host: "0.0.0.0", + allowedHosts: "all", + }, + }; - const config = { - mode: env.mode ?? 'development', - performance: { - hints: false, - maxEntrypointSize: 512000, - maxAssetSize: 512000 - }, - entry: './src/index.js', - output: { - // filename: '[name].[contenthash].js', - filename: 'bundle.js', - publicPath: '/', - path: path.resolve(__dirname, 'dist'), - clean: true - }, - plugins: [ - new HtmlWebpackPlugin({template: path.resolve(__dirname, 'public', 'index.html')}), - isDev ? undefined : new MiniCssExtractPlugin({ - filename: 'css/[name].[contenthash:8].css', - chunkFilename: 'css/[name].[contenthash:8].css' - }) - ], - module: { - rules: [ - { - test: /\.(scss|css)$/, - use: [ - isDev ? 'style-loader' : MiniCssExtractPlugin.loader, - cssLoader, - 'sass-loader' - ], - }, - { - test: /\.(js|jsx)$/, - exclude: /node_modules/, - use: { - loader: "babel-loader", - options: { - presets: [ - '@babel/preset-env', - '@babel/preset-react' - ] - } - } - } - ] - }, - devServer: { - port: env.port ?? 3000, - open: true, - historyApiFallback: true - } - }; - - return config -} \ No newline at end of file + return config; +};