mirror of
https://github.com/stonith404/pingvin-share.git
synced 2025-02-19 01:55:48 -05:00
Merge branch 'development' into main
This commit is contained in:
commit
f3ec9be63b
7 changed files with 108 additions and 53 deletions
96
CONTRIBUTING.md
Normal file
96
CONTRIBUTING.md
Normal file
|
@ -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`<br/>
|
||||||
|
|
||||||
|
```
|
||||||
|
$ 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.
|
32
README.md
32
README.md
|
@ -10,10 +10,11 @@ Demo: https://pingvin-share.dev.eliasschneider.com
|
||||||
|
|
||||||
## ✨ Features
|
## ✨ 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
|
- 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
|
- Optionally secure your share with a visitor limit and a password
|
||||||
- Dark mode
|
- Light & dark mode
|
||||||
|
|
||||||
## ⌨️ Setup
|
## ⌨️ Setup
|
||||||
|
|
||||||
|
@ -43,29 +44,4 @@ Just update the docker container by running `docker compose pull && docker compo
|
||||||
|
|
||||||
## 🖤 Contribute
|
## 🖤 Contribute
|
||||||
|
|
||||||
You're very welcome to contribute to Pingvin Share!
|
You're very welcome to contribute to Pingvin Share! Follow the [contribution guide](/CONTRIBUTING.md) to get started.
|
||||||
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.
|
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
SHOW_HOME_PAGE=true
|
SHOW_HOME_PAGE=true
|
||||||
ALLOW_REGISTRATION=true
|
ALLOW_REGISTRATION=true
|
||||||
MAX_FILE_SIZE=1000000000
|
MAX_FILE_SIZE=1000000000
|
||||||
TWELVE_HOUR_TIME=false
|
|
||||||
|
|
|
@ -5,8 +5,6 @@ const nextConfig = {
|
||||||
ALLOW_REGISTRATION: process.env.ALLOW_REGISTRATION,
|
ALLOW_REGISTRATION: process.env.ALLOW_REGISTRATION,
|
||||||
SHOW_HOME_PAGE: process.env.SHOW_HOME_PAGE,
|
SHOW_HOME_PAGE: process.env.SHOW_HOME_PAGE,
|
||||||
MAX_FILE_SIZE: process.env.MAX_FILE_SIZE,
|
MAX_FILE_SIZE: process.env.MAX_FILE_SIZE,
|
||||||
BACKEND_URL: process.env.BACKEND_URL,
|
|
||||||
TWELVE_HOUR_TIME: process.env.TWELVE_HOUR_TIME
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
import {
|
import {
|
||||||
Accordion,
|
Accordion,
|
||||||
Button,
|
Button,
|
||||||
Col,
|
|
||||||
Checkbox,
|
Checkbox,
|
||||||
|
Col,
|
||||||
Grid,
|
Grid,
|
||||||
NumberInput,
|
NumberInput,
|
||||||
PasswordInput,
|
PasswordInput,
|
||||||
|
@ -13,13 +13,10 @@ import {
|
||||||
} from "@mantine/core";
|
} from "@mantine/core";
|
||||||
import { useForm, yupResolver } from "@mantine/form";
|
import { useForm, yupResolver } from "@mantine/form";
|
||||||
import { useModals } from "@mantine/modals";
|
import { useModals } from "@mantine/modals";
|
||||||
|
import moment from "moment";
|
||||||
import * as yup from "yup";
|
import * as yup from "yup";
|
||||||
import shareService from "../../services/share.service";
|
import shareService from "../../services/share.service";
|
||||||
import { ShareSecurity } from "../../types/share.type";
|
import { ShareSecurity } from "../../types/share.type";
|
||||||
import moment from "moment";
|
|
||||||
import getConfig from "next/config";
|
|
||||||
|
|
||||||
const { publicRuntimeConfig } = getConfig();
|
|
||||||
|
|
||||||
const PreviewExpiration = ({ form }: { form: any }) => {
|
const PreviewExpiration = ({ form }: { form: any }) => {
|
||||||
const value = form.values.never_expires
|
const value = form.values.never_expires
|
||||||
|
@ -34,14 +31,7 @@ const PreviewExpiration = ({ form }: { form: any }) => {
|
||||||
)
|
)
|
||||||
.toDate();
|
.toDate();
|
||||||
|
|
||||||
if (publicRuntimeConfig.TWELVE_HOUR_TIME === "true")
|
return `This share will expire on ${moment(expirationDate).format("LLL")}`;
|
||||||
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"
|
|
||||||
)}`;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const CreateUploadModalBody = ({
|
const CreateUploadModalBody = ({
|
||||||
|
|
|
@ -62,11 +62,9 @@ const Body = ({ share }: { share: Share }) => {
|
||||||
{/* If our share.expiration is timestamp 0, show a different message */}
|
{/* If our share.expiration is timestamp 0, show a different message */}
|
||||||
{moment(share.expiration).unix() === 0
|
{moment(share.expiration).unix() === 0
|
||||||
? "This share will never expire."
|
? "This share will never expire."
|
||||||
: `This share will expire on ${
|
: `This share will expire on ${moment(share.expiration).format(
|
||||||
publicRuntimeConfig.TWELVE_HOUR_TIME === "true"
|
"LLL"
|
||||||
? moment(share.expiration).format("MMMM Do YYYY, h:mm a")
|
)}`}
|
||||||
: moment(share.expiration).format("MMMM DD YYYY, HH:mm")
|
|
||||||
}`}
|
|
||||||
</Text>
|
</Text>
|
||||||
|
|
||||||
<Button
|
<Button
|
||||||
|
|
|
@ -14,6 +14,7 @@ import { useClipboard } from "@mantine/hooks";
|
||||||
import { useModals } from "@mantine/modals";
|
import { useModals } from "@mantine/modals";
|
||||||
import { NextLink } from "@mantine/next";
|
import { NextLink } from "@mantine/next";
|
||||||
import moment from "moment";
|
import moment from "moment";
|
||||||
|
import getConfig from "next/config";
|
||||||
import { useRouter } from "next/router";
|
import { useRouter } from "next/router";
|
||||||
import { useEffect, useState } from "react";
|
import { useEffect, useState } from "react";
|
||||||
import { TbLink, TbTrash } from "react-icons/tb";
|
import { TbLink, TbTrash } from "react-icons/tb";
|
||||||
|
@ -22,7 +23,6 @@ import useUser from "../../hooks/user.hook";
|
||||||
import shareService from "../../services/share.service";
|
import shareService from "../../services/share.service";
|
||||||
import { MyShare } from "../../types/share.type";
|
import { MyShare } from "../../types/share.type";
|
||||||
import toast from "../../utils/toast.util";
|
import toast from "../../utils/toast.util";
|
||||||
import getConfig from "next/config";
|
|
||||||
|
|
||||||
const { publicRuntimeConfig } = getConfig();
|
const { publicRuntimeConfig } = getConfig();
|
||||||
|
|
||||||
|
@ -77,9 +77,7 @@ const MyShares = () => {
|
||||||
<td>
|
<td>
|
||||||
{moment(share.expiration).unix() === 0
|
{moment(share.expiration).unix() === 0
|
||||||
? "Never"
|
? "Never"
|
||||||
: publicRuntimeConfig.TWELVE_HOUR_TIME === "true"
|
: moment(share.expiration).format("LLL")}
|
||||||
? moment(share.expiration).format("MMMM Do YYYY, h:mm a")
|
|
||||||
: moment(share.expiration).format("MMMM DD YYYY, HH:mm")}
|
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<Group position="right">
|
<Group position="right">
|
||||||
|
|
Loading…
Add table
Reference in a new issue