under-falling-skies/src/lib/components/Campaigns.svelte

133 lines
2.7 KiB
Svelte
Raw Normal View History

2023-01-15 21:27:49 +00:00
<header class="fixed fill">
2023-01-14 18:25:46 +00:00
<nav>
<h5 class="max center-align">Campaigns</h5>
<button class="circle small" on:click={newCampaign}>
<i>add</i>
</button>
</nav>
</header>
2023-01-12 16:13:36 +00:00
2023-01-14 18:25:46 +00:00
<article>
2023-01-17 00:23:48 +00:00
{#if !$campaigns || $campaigns.length === 0}
<div class="fill medium-height middle-align center-align">
<div class="center-align">
<h5>No campaign created yet</h5>
</div>
</div>
{/if}
2023-01-14 18:25:46 +00:00
{#each $campaigns as campaign (campaign._id)}
2023-01-12 16:13:36 +00:00
<div class="row">
<i class="light-green-text">south_america</i>
<div class="max">
2023-01-12 21:42:34 +00:00
<h6>
2023-01-13 17:51:02 +00:00
<a href={`#/campaign/${campaign._id}`}>
2023-01-12 21:42:34 +00:00
{campaign.name}
</a>
</h6>
2023-01-12 23:02:29 +00:00
<p>
{#if campaign.battles}
2023-01-15 22:34:39 +00:00
<a href={`#/campaign/${campaign._id}`}>
chapter {currentChapter(campaign)}, battle of {currentCity(
campaign,
)}.
</a>
2023-01-12 23:02:29 +00:00
{/if}
</p>
2023-01-12 16:13:36 +00:00
</div>
<button on:click={deleteCampaign(campaign)} class="none"
>Delete</button
>
</div>
{/each}
2023-01-16 20:03:58 +00:00
<footer class="bottom absolute center">
fan-made campaign manager for <a
href="https://czechgames.com/en/under-falling-skies/"
>Under Falling Skies</a
><br /> written by
<a href="mailto:yanick@sky.babyl.ca">Yanick Champoux</a>
</footer>
2023-01-12 16:13:36 +00:00
</article>
2023-01-15 21:27:49 +00:00
{#if showNewCampaign}
<div class="modal active">
2023-01-15 22:34:39 +00:00
<form>
<h5>New campaign</h5>
<div>
<div class="field border">
<input
autofocus
type="text"
bind:value={newCampaignName}
placeholder="Campaign name"
/>
</div>
2023-01-15 21:27:49 +00:00
</div>
2023-01-15 22:34:39 +00:00
<nav class="right-align">
<button
class="border"
on:click={() => (showNewCampaign = false)}>Cancel</button
>
<button on:click={saveNewCampaign}>Create</button>
</nav>
</form>
2023-01-12 21:42:34 +00:00
</div>
2023-01-15 21:27:49 +00:00
{/if}
2023-01-12 21:42:34 +00:00
2023-01-12 16:13:36 +00:00
<script>
2023-01-12 23:02:29 +00:00
import * as R from 'remeda';
2023-01-12 21:42:34 +00:00
import { getContext } from 'svelte';
2023-01-13 17:51:02 +00:00
// import { goto } from '$app/navigation';
const goto = () => {};
2023-01-12 21:42:34 +00:00
export let api = getContext('api');
2023-01-13 17:51:02 +00:00
export let campaigns = api?.campaigns;
2023-01-12 21:42:34 +00:00
let showNewCampaign = false;
let newCampaignName = '';
2023-01-12 16:13:36 +00:00
2023-01-12 23:02:29 +00:00
const currentChapter = ({ battles }) =>
R.clamp(1 + parseInt(battles?.length / 2), { max: 4 });
2023-01-15 21:27:49 +00:00
const currentCity = ({ battles }) => {
2023-01-16 18:53:22 +00:00
const c = R.last(battles)?.city;
return typeof c === 'string' ? c : c?.selection;
2023-01-15 21:27:49 +00:00
};
2023-01-12 23:02:29 +00:00
2023-01-14 18:25:46 +00:00
async function deleteCampaign({ name, _id }) {
2023-01-12 16:13:36 +00:00
if (!window.confirm(`delete campaign ${name}?`)) return;
2023-01-14 18:25:46 +00:00
api.event.deleteCampaign(_id);
2023-01-12 16:13:36 +00:00
}
const newCampaign = () => {
2023-01-12 21:42:34 +00:00
showNewCampaign = true;
};
const saveNewCampaign = () => {
2023-01-15 22:34:39 +00:00
console.log('sent');
2023-01-12 21:42:34 +00:00
api.event.addCampaign(newCampaignName);
newCampaignName = '';
showNewCampaign = false;
2023-01-12 16:13:36 +00:00
};
</script>
<style>
2023-01-14 18:25:46 +00:00
nav {
width: 100%;
}
2023-01-12 16:13:36 +00:00
header {
display: flex;
}
h5 {
flex: 1;
}
2023-01-12 21:42:34 +00:00
article {
height: 90vh;
}
2023-01-16 20:03:58 +00:00
footer {
width: 90%;
text-align: center;
}
footer a {
text-decoration: underline;
}
2023-01-12 16:13:36 +00:00
</style>