iceshrimp-legacy/packages/client/src/components/MkDonation.vue
ThatOneCalculator 04224bfc66
feat: Donation pop-up with optional admin link
Co-authored-by: Syuilo <syuilotan@yahoo.co.jp>
2023-07-11 23:23:44 -07:00

132 lines
2.6 KiB
Vue

<template>
<div class="_panel _shadow" :class="$style.root">
<div :class="$style.icon">
<i class="ph-hand-heart ph-bold ph-6x" />
</div>
<div :class="$style.main">
<div :class="$style.title">
{{ i18n.ts._aboutMisskey.donateTitle }}
</div>
<div :class="$style.text">
{{ i18n.ts._aboutMisskey.pleaseDonateToCalckey }}
<p v-if="instance.donationLink">
{{
i18n.t("_aboutMisskey.pleaseDonateToHost", {
host: hostname,
})
}}
</p>
</div>
<div class="_flexList">
<MkButton primary @click="openCalckeyDonation">{{
i18n.ts._aboutMisskey.donate
}}</MkButton>
<MkButton v-if="instance.donationLink" primary @click="openExternalDonation">{{
i18n.t("_aboutMisskey.donateHost", {
host: hostname,
})
}}</MkButton>
</div>
<div class="_flexList">
<MkButton @click="close">{{ i18n.ts.remindMeLater }}</MkButton>
<MkButton @click="neverShow">{{ i18n.ts.neverShow }}</MkButton>
</div>
</div>
<button class="_button" :class="$style.close" @click="close">
<i class="ph-x ph-bold ph-lg"></i>
</button>
</div>
</template>
<script lang="ts" setup>
import MkButton from "@/components/MkButton.vue";
import { host } from "@/config";
import { i18n } from "@/i18n";
import * as os from "@/os";
import { instance } from "@/instance";
const emit = defineEmits<{
(ev: "closed"): void;
}>();
const hostname = instance.name?.length <= 20 ? instance.name : host;
const zIndex = os.claimZIndex("low");
function close() {
localStorage.setItem("latestDonationInfoShownAt", Date.now().toString());
emit("closed");
}
function neverShow() {
localStorage.setItem("neverShowDonationInfo", "true");
close();
}
function openCalckeyDonation() {
window.open("https://opencollective.com/calckey", "_blank");
}
function openExternalDonation() {
let link = instance.donationLink;
if (!/^https?:\/\//i.test(link)) {
link = `http://${link}`;
}
window.open(link, "_blank");
}
</script>
<style lang="scss" module>
.root {
position: fixed;
z-index: v-bind(zIndex);
bottom: var(--margin);
left: 0;
right: 0;
margin: auto;
box-sizing: border-box;
width: calc(100% - (var(--margin) * 2));
max-width: 500px;
display: flex;
}
.icon {
text-align: center;
padding-top: 25px;
width: 100px;
color: var(--accent);
}
@media (max-width: 500px) {
.icon {
width: 80px;
}
}
@media (max-width: 450px) {
.icon {
width: 70px;
}
}
.main {
padding: 25px 25px 25px 0;
flex: 1;
}
.close {
position: absolute;
top: 8px;
right: 8px;
padding: 8px;
}
.title {
font-weight: bold;
}
.text {
margin: 0.7em 0 1em 0;
}
</style>