diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..bebc9ee --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,96 @@ +# Contributing + +We would ❤️ for you to contribute to Pingvin Share and help make it better! All contributions are welcome, including issues, suggestions, pull requests and more. + +## Getting started +You've found a bug, have suggestion or something else, just create an issue on GitHub and we can get in touch 😊. + + +## Submit a Pull Request +Once you created a issue and you want to create a pull request, follow this guide. + +Branch naming convention is as following + +`TYPE-ISSUE_ID-DESCRIPTION` + +example: + +``` +feat-69-ability-to-set-share-expiration-to-never +``` + +When `TYPE` can be: + +- **feat** - is a new feature +- **doc** - documentation only changes +- **fix** - a bug fix +- **refactor** - code change that neither fixes a bug nor adds a feature + +**All PRs must include a commit message with the changes description!** + +For the initial start, fork the project and use the `git clone` command to download the repository to your computer. A standard procedure for working on an issue would be to: + +1. `git pull`, before creating a new branch, pull the changes from upstream. Your master needs to be up to date. + +``` +$ git pull +``` + +2. Create new branch from `main` like: `feat-69-ability-to-set-share-expiration-to-never`
+ +``` +$ git checkout -b [name_of_your_new_branch] +``` + +3. Work - commit - repeat + +4. Before you push your changes, make sure you run the linter and format the code. + +```bash +npm run lint +npm run format +``` + +5. Push changes to GitHub + +``` +$ git push origin [name_of_your_new_branch] +``` + +6. Submit your changes for review + If you go to your repository on GitHub, you'll see a `Compare & pull request` button. Click on that button. +7. Start a Pull Request + Now submit the pull request and click on `Create pull request`. +8. Get a code review approval/reject + +## Setup project + +Pingvin Share consists of a frontend and a backend. + +### Backend + +The backend is built with [Nest.js](https://nestjs.com) and uses Typescript. + +#### Setup + +1. Open the `backend` folder +2. Duplicate the `.env.example` file, rename the duplicate to `.env` and change the environment variables if needed +3. Install the dependencies with `npm install` +4. Push the database schema to the database by running `npx prisma db push` +5. Start the backend with `npm run dev` + +### Frontend +The frontend is built with [Next.js](https://nextjs.org) and uses Typescript. + +#### Setup +1. Start the backend first +2. Open the `frontend` folder +3. Duplicate the `.env.example` file, rename the duplicate to `.env` and change the environment variables if needed +4. Install the dependencies with `npm install` +5. Start the frontend with `npm run dev` + +You're all set! + +### Testing + +At the moment we only have system tests for the backend. To run these tests, run `npm run test:system` in the backend folder. diff --git a/README.md b/README.md index f3d48d1..8302206 100644 --- a/README.md +++ b/README.md @@ -10,10 +10,11 @@ Demo: https://pingvin-share.dev.eliasschneider.com ## ✨ Features -- Create a simple share with a link +- Create a share with files that you can access with a link - No file size limit, only your disk will be your limit +- Set a share expiration - Optionally secure your share with a visitor limit and a password -- Dark mode +- Light & dark mode ## ⌨️ Setup @@ -43,29 +44,4 @@ Just update the docker container by running `docker compose pull && docker compo ## 🖤 Contribute -You're very welcome to contribute to Pingvin Share! -Contact me, create an issue or directly create a pull request. - -### Development setup - -#### Backend - -1. Open the `backend` folder -2. Duplicate the `.env.example` file, rename the duplicate to `.env` and change the environment variables if needed -3. Install the dependencies with `npm install` -4. Push the database schema to the database by running `npx prisma db push` -5. Start the backend with `npm run dev` - -#### Frontend - -1. Start the backend first -2. Open the `frontend` folder -3. Duplicate the `.env.example` file, rename the duplicate to `.env` and change the environment variables if needed -4. Install the dependencies with `npm install` -5. Start the frontend with `npm run dev` - -You're all set! - -### Testing - -At the moment we only have system tests for the backend. To run these tests, run `npm run test:system` in the backend folder. +You're very welcome to contribute to Pingvin Share! Follow the [contribution guide](/CONTRIBUTING.md) to get started. diff --git a/frontend/.env.example b/frontend/.env.example index 7e65299..dbda902 100644 --- a/frontend/.env.example +++ b/frontend/.env.example @@ -1,4 +1,3 @@ SHOW_HOME_PAGE=true ALLOW_REGISTRATION=true MAX_FILE_SIZE=1000000000 -TWELVE_HOUR_TIME=false diff --git a/frontend/next.config.js b/frontend/next.config.js index dea14c0..16030c9 100644 --- a/frontend/next.config.js +++ b/frontend/next.config.js @@ -5,8 +5,6 @@ const nextConfig = { ALLOW_REGISTRATION: process.env.ALLOW_REGISTRATION, SHOW_HOME_PAGE: process.env.SHOW_HOME_PAGE, MAX_FILE_SIZE: process.env.MAX_FILE_SIZE, - BACKEND_URL: process.env.BACKEND_URL, - TWELVE_HOUR_TIME: process.env.TWELVE_HOUR_TIME } } diff --git a/frontend/src/components/share/CreateUploadModalBody.tsx b/frontend/src/components/share/CreateUploadModalBody.tsx index 0450763..f4dd7d4 100644 --- a/frontend/src/components/share/CreateUploadModalBody.tsx +++ b/frontend/src/components/share/CreateUploadModalBody.tsx @@ -1,8 +1,8 @@ import { Accordion, Button, - Col, Checkbox, + Col, Grid, NumberInput, PasswordInput, @@ -13,13 +13,10 @@ import { } from "@mantine/core"; import { useForm, yupResolver } from "@mantine/form"; import { useModals } from "@mantine/modals"; +import moment from "moment"; import * as yup from "yup"; import shareService from "../../services/share.service"; import { ShareSecurity } from "../../types/share.type"; -import moment from "moment"; -import getConfig from "next/config"; - -const { publicRuntimeConfig } = getConfig(); const PreviewExpiration = ({ form }: { form: any }) => { const value = form.values.never_expires @@ -34,14 +31,7 @@ const PreviewExpiration = ({ form }: { form: any }) => { ) .toDate(); - if (publicRuntimeConfig.TWELVE_HOUR_TIME === "true") - return `This share will expire on ${moment(expirationDate).format( - "MMMM Do YYYY, h:mm a" - )}`; - else - return `This share will expire on ${moment(expirationDate).format( - "MMMM DD YYYY, HH:mm" - )}`; + return `This share will expire on ${moment(expirationDate).format("LLL")}`; }; const CreateUploadModalBody = ({ diff --git a/frontend/src/components/upload/showCompletedUploadModal.tsx b/frontend/src/components/upload/showCompletedUploadModal.tsx index 68c32ae..ac7de64 100644 --- a/frontend/src/components/upload/showCompletedUploadModal.tsx +++ b/frontend/src/components/upload/showCompletedUploadModal.tsx @@ -62,11 +62,9 @@ const Body = ({ share }: { share: Share }) => { {/* If our share.expiration is timestamp 0, show a different message */} {moment(share.expiration).unix() === 0 ? "This share will never expire." - : `This share will expire on ${ - publicRuntimeConfig.TWELVE_HOUR_TIME === "true" - ? moment(share.expiration).format("MMMM Do YYYY, h:mm a") - : moment(share.expiration).format("MMMM DD YYYY, HH:mm") - }`} + : `This share will expire on ${moment(share.expiration).format( + "LLL" + )}`}