1
0
mirror of https://github.com/JustKato/FreePad.git synced 2026-02-23 15:50:46 +02:00

Started working on V2 rework

This commit is contained in:
2022-05-18 22:54:07 +03:00
parent 2d7d6a2f8b
commit 89eaceddcc
57 changed files with 22 additions and 680 deletions

View File

@@ -1 +0,0 @@
DROP TABLE IF EXISTS t_posts;

View File

@@ -1,12 +0,0 @@
CREATE TABLE IF NOT EXISTS `t_posts` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(256) NOT NULL DEFAULT '' COLLATE 'latin1_swedish_ci',
`content` MEDIUMTEXT NOT NULL COLLATE 'latin1_swedish_ci',
`ts` DATETIME NOT NULL DEFAULT current_timestamp(),
`ts_updated` DATETIME NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `name` (`name`) USING BTREE
)
COLLATE='latin1_swedish_ci'
ENGINE=InnoDB
;

View File

@@ -1 +0,0 @@
DROP table t_posts;

View File

@@ -1,6 +0,0 @@
CREATE TABLE IF NOT EXISTS "t_posts" (
"id" INTEGER,
"name" TEXT,
"content" TEXT,
PRIMARY KEY("id" AUTOINCREMENT)
);

View File

View File

@@ -1,3 +0,0 @@
#post_content {
height: calc(100vh - 35rem);
}

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 218 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 186 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 780 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1021 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

View File

106
dist/static/js/main.js vendored
View File

@@ -1,106 +0,0 @@
function setStatus(text, className ) {
// Show loading
const statusIndicator = document.getElementById(`status-indicator`);
if ( !!statusIndicator ) {
// Clear all previous status-es
for ( let [x, k] of statusIndicator.classList.entries() ) {
statusIndicator.classList.remove(k);
}
// Mark as loading
statusIndicator.textContent = text;
statusIndicator.classList.add(className);
}
}
function updatePost(postName) {
const postContentElement = document.getElementById(`post_content`);
if ( !!postContentElement && !!postContentElement.value ) {
const postContent = String(postContentElement.value);
if ( !!postContent && postContent.length > 0 ) {
setStatus(`Loading...`, `has-text-warning`);
// Generate the form data
let formData = new FormData();
formData.append('name', postName);
formData.append('content', postContent);
// Send out a fetch request
fetch("/api/post", {
method: "post",
body: formData,
})
.then( result => {
if ( result.status < 200 || result.status > 299 ) {
if ( result.status == 429) {
setStatus(`Too many requests, please wait`, `has-text-danger`);
} else {
setStatus(`Failed to Save`, `has-text-danger`);
}
} else {
setStatus(`Saved`, `has-text-success`);
}
console.log(result);
})
.catch( error => {
console.error(error);
alert(error);
setStatus(`Failed to Save`, `has-text-danger`);
})
}
}
}
/**
* @location /
* @role Searching
*/
function goToPost() {
// Get the post name element
const postNameElement = document.getElementById(`postName`);
// Check if the element exists
if ( !!postNameElement ) {
// Get the post name string
const postName = String(postNameElement.value);
// Check if the post name is valid
if ( !!postName && postName.length > 0 && postName.length <= 256 ) {
// Change the location
window.location.href = `/${postName}`;
}
}
}
function getQr(link = `https://justkato.me/`) {
return new Promise((_r, _e) => {
let formData = new FormData();
formData.append('link', link);
// Send out a fetch request
fetch("/api/qr", {
method: "post",
body: formData,
})
.then( result => {
result.json()
.then( rez => {
return _r(rez);
})
})
.catch( error => {
console.error(error);
alert(error);
return _e(error);
})
})
}

View File

View File

@@ -1,20 +0,0 @@
{{ define "inc/footer.html"}}
<footer class="footer">
<div class="content has-text-centered">
<p>
<strong>FreePad</strong> by <a href="https://justkato.me">Kato Twofold</a>.
<br>
The source code is licensed under the
<a href="http://opensource.org/licenses/mit-license.php">MIT</a> License.
<br>
The project is <b>Free and Open Source</b>, check out our <a href="https://github.com/JustKato/FreePad">Github Repo</a>.
<br>
Powered by <b>Go</b>phers!
</p>
</div>
</footer>
<script src="/static/js/main.js"></script>
{{ end }}

View File

@@ -1,22 +0,0 @@
{{ define "inc/header.html"}}
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>FreePad - {{.title}}</title>
<meta name="description" content="Pastebin.com is the number one paste tool since 2002. Pastebin is a website where you can store text online for a set period of time." />
<meta property="og:description" content="Pastebin.com is the number one paste tool since 2002. Pastebin is a website where you can store text online for a set period of time." />
<meta property="fb:app_id" content="231493360234820" />
<meta property="og:title" content="FreePad.com - #1 paste tool since 2002!" />
<meta property="og:type" content="article" />
<meta property="og:site_name" content="FreePad" />
<meta property="og:url" content="{{.domain_base}}/" />
<link rel="icon" type="image/png" href="/static/img/gopher.png"/>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bulma@0.9.4/css/bulma.min.css">
<link rel="stylesheet" type="text/css" href="https://unpkg.com/bulma-prefers-dark" />
<link rel="stylesheet" href="/static/css/main.css">
</head>
{{ end }}

View File

@@ -1,42 +0,0 @@
{{ template "inc/header.html" .}}
<body>
<div class="container is-fullhd p-4 mb-6" style="min-height: 50rem; height: calc(100vh - 18rem)">
<h1 class="title">FreePad</h1>
<h2 class="subtitle">Free and Open source internet notepad</h2>
<hr class="mb-6">
<div class="content">
<form class="columns px-4 mt-6" onsubmit="goToPost(); return false;">
<span class="mt-2 is-size-4" style="font-family: monospace">{{.domain_base}}/</span>
<input class="mt-2 input mr-4" type="text" name="postName" id="postName" style="font-family: monospace" placeholder="Something memorable">
<button class="mt-2 button" type="submit">Open</button>
</form>
</div>
<div class="content my-4">
<h3>Why FreePad</h3>
<p>Why should you use FreePad and not some other provider?</p>
<ol>
<li style="list-style-type: none;">Keep it simple 😎</li>
<li style="list-style-type: none;">Don't worry about passwords 📔</li>
<li style="list-style-type: none;">You can be a mess, it's all temporary 🗑</li>
<li style="list-style-type: none;">Quick and Clean 🧼</li>
</ol>
</div>
<div class="content my-6">
<h3>Some Rules</h3>
<p>FreePad has an API and you can use it to interact with it, although there are some limitations.</p>
<ol>
<li>You are going to be rate-limited if you spam too much and put on a cooldown</li>
<li>There's only so many pages that can be stored before affecting performance</li>
<li>Automatic Shadowbanning</li>
</ol>
</div>
</div>
{{ template "inc/footer.html" .}}
</body>

View File

@@ -1,55 +0,0 @@
{{ template "inc/header.html" .}}
<style>
.qrImage[src=""] {
display: none;
}
</style>
<body>
<div class="container is-fullhd p-4 mb-6" style="min-height: 35rem; height: calc(100vh - 18rem)">
<h1 class="title">FreePad</h1>
<img class="qrImage" src="" alt="" style="position: fixed;top: 1rem;left: 1rem;max-width: 13vw;">
<h2 class="subtitle">Reading from <code>{{.domain_base}}/{{.title}}</code></h2>
<hr>
<div class="content">
<div class="block">
<a href="/" class="button is-light">Back Home</a>
<a href="javascript:fetchMyQr()" class="button is-primary">QR</a>
<a href="javascript:updateSelf()" class="button is-success">Save</a>
<p class="mt-3">Status: <code class="has-text-primary" id="status-indicator">Loaded</code></p>
</div>
<textarea class="input" name="post_content" id="post_content" onchange="updateSelf()">{{.post_content}}</textarea>
</div>
</div>
<script>
async function fetchMyQr() {
let qrCode = await getQr(window.location.href)
.catch( err => {
console.error(err);
})
console.log(qrCode);
if ( !!qrCode.qr ) {
document.querySelectorAll(`.qrImage`).forEach( img => {
console.log(img);
console.log(qrCode.qr);
img.src = qrCode.qr;
})
}
}
function updateSelf() {
updatePost({{.title}})
}
</script>
{{ template "inc/footer.html" .}}
</body>
<script src="https://raw.githubusercontent.com/scotch-io/javascript-modal/master/Modal.js"></script>