Shioriko/web/app/src/routes/Post/Upload.svelte

119 lines
3.9 KiB
Svelte
Raw Normal View History

2021-05-10 17:37:27 +00:00
<script>
2022-04-15 19:20:14 +00:00
import { uploadBlob, postCreate, getTagAutocomplete } from "../../api.js";
2021-05-11 18:22:46 +00:00
import { navigate, Link } from "svelte-routing";
2021-05-10 17:37:27 +00:00
import Tags from "svelte-tags-input";
2022-04-15 19:20:14 +00:00
import AuthRequired from "../../AuthRequired.svelte";
2021-05-10 17:37:27 +00:00
let currentProgress = 0;
let fileName = "";
2021-05-11 18:22:46 +00:00
let similar = [];
2021-05-10 17:37:27 +00:00
let form = {
blob_id: "",
source_url: "",
tags: [],
};
const onProgress = (e) => {
var percentCompleted = Math.round((e.loaded * 100) / e.total);
currentProgress = percentCompleted;
};
const onFileChange = async (e) => {
fileName = "";
2021-05-11 18:22:46 +00:00
similar = [];
2021-05-10 17:37:27 +00:00
var file = e.target.files[0];
if (file) {
var response = await uploadBlob({ file, onProgress });
2021-05-11 18:22:46 +00:00
if (response.similar) {
similar = response.similar;
}
2021-05-10 17:37:27 +00:00
form.blob_id = response.id;
fileName = file.name;
}
};
const onTagChange = (value) => {
form.tags = value.detail.tags;
2021-05-11 18:22:46 +00:00
};
2021-05-10 17:37:27 +00:00
2022-04-16 12:23:19 +00:00
const onAutocomplete = async (tag) => {
const list = await getTagAutocomplete({ tag, positive: true });
2021-09-10 18:56:42 +00:00
return list;
};
2021-05-10 17:37:27 +00:00
const onSubmit = async () => {
const response = await postCreate(form);
navigate(`/post/${response.id}`);
};
</script>
2021-05-10 21:05:55 +00:00
<AuthRequired />
2021-05-10 17:37:27 +00:00
<section class="section">
<div class="container">
2022-04-14 20:38:53 +00:00
<h1 class="title">Upload Image</h1>
2021-05-10 17:37:27 +00:00
<form on:submit|preventDefault={onSubmit}>
<div class="field">
<label for="file" class="label">Image File</label>
<div class="control">
<div class="file">
<label class="file-label">
<input
id="file"
class="file-input"
type="file"
name="resume"
on:change={onFileChange}
/>
<span class="file-cta">
<span class="file-icon" />
<span class="file-label"> Choose a file… </span>
</span>
</label>
</div>
</div>
{#if currentProgress > 0 && currentProgress < 100}
<p class="help">{currentProgress}%</p>
{/if}
{#if fileName !== ""}
<p class="help">{fileName} uploaded</p>
{/if}
2021-05-11 18:22:46 +00:00
{#if similar.length > 0}
<p class="help">
Similar posts:
{#each similar as post, i}
<Link to="/post/{post.id}">{post.id}</Link>
{#if i < similar.length - 1}
,
{/if}
{/each}
</p>
{/if}
2021-05-10 17:37:27 +00:00
</div>
<div class="field">
<label for="source" class="label">Source URL</label>
<div class="control">
<input
id="source"
class="input"
type="url"
placeholder="Source URL"
bind:value={form.source_url}
/>
</div>
</div>
<div class="field">
<label for="tags" class="label">Tags</label>
<div class="control" id="tags">
2022-04-16 12:23:19 +00:00
<Tags addKeys={[9, 32]} on:tags={onTagChange} autoComplete={onAutocomplete} autoCompleteFilter={false}/>
2021-05-10 17:37:27 +00:00
</div>
</div>
<div class="control">
<button type="submit" class="button is-primary">Submit</button>
</div>
</form>
</div>
</section>