* Migrate to Nuxt 3 * Update vercel config * remove tsconfig comment * Changelog experiment + working proj pages * Fix package json * Prevent vercel complaining * fix deploy (hopefully) * Tag generator * Switch to yarn * Vercel pls 🙏 * Fix tag generation bug * Make (most) non-logged in pages work * fix base build * Linting + state * Eradicate axios, make most user pages work * Fix checkbox state being set incorrectly * Make most things work * Final stretch * Finish (most) things * Move to update model value * Fix modal text getting blurred from transforms (#964) * Adjust nav-link border radius when focused (#961) * Transition between animation states on TextLogo (#955) * Transition between animation states on TextLogo * Remove unused refs * Fixes from review * Disable tabbing to pagination arrows when disabled (#972) * Make position of the "no results" text on grid/gallery views consistent (fixes #963) (#965) * Fix position of the "no results" text on grid view * fix padding * Remove extra margin on main page, fixes #957 (#959) * Fix layout shift and placeholder line height (#973) * Fix a lot of issues * Fix more nuxt 3 issues * fix not all versions showing up (temp) * inline inter css file * More nuxt 3 fixes * [skip ci] broken- backup changes * Change modpack warnings to blue instead of red (#991) * Fix some hydration issues * Update nuxt * Fix some images not showing * Add pagination to versions page + fix lag * Make changelog page consistent with versions page * sync before merge * Delete old file * Fix actions failing * update branch * Fixes navbar transition animation. (#1012) * Fixes navbar transition animation. * Fixes Y-axis animation. Fixes mobile menu. Removes highlightjs prop. * Changes xss call to renderString. * Fixes renderString call. * Removes unnecessary styling. * Reverts mobile nav change. * Nuxt 3 Lazy Loading Search (#1022) * Uses lazyFetch for results. onSearchChange refreshes. Adds loading circle. * Removes console.log * Preserves old page when paging. * Diagnosing filtering bugs. * Fix single facet filtering * Implements useAuth in settings/account. * tiny ssr fix * Updating nuxt.config checklist. * Implements useAuth in revenue, moneitzation, and dashboard index pages. * Fixes setups. * Eliminates results when path changes. Adds animated logo. * Ensures loading animation renders on search page. --------- Co-authored-by: Jai A <jaiagr+gpg@pm.me> * Fix navigation issues * Square button fix (#1023) * Removes checklist from nuxt.config. * Modifies Nuxt CI to build after linting. * Fixes prettierignore file. * bug fixes * Update whitelist domains * Page improvements, fix CLS * Fix a lot of things * Fix project type redirect * Fix 404 errors * Fix user settings + hydration error * Final fixes * fix(creator-section): border radius on icons not aligning with bg (#1027) Co-authored-by: MagnusHJensen <magnus.holm.jensen@lego.dk> * Improvements to the mobile navbar (#984) * Transition between animation states on TextLogo * Remove unused refs * Fixes from review * Improvements to the mobile nav menu * fix avatar alt text * Nevermind, got confused for a moment * Tab bar, menu layout improvements * Highlight search icon when menu is open * Update layouts/default.vue Co-authored-by: Magnus Jensen <magnushjensen.mail@gmail.com> * Fix some issues * Use caret instead * Run prettier * Add create a project --------- Co-authored-by: Magnus Jensen <magnushjensen.mail@gmail.com> Co-authored-by: Geometrically <18202329+Geometrically@users.noreply.github.com> Co-authored-by: Jai A <jaiagr+gpg@pm.me> * Fix mobile menu issues * More issues * Fix lint --------- Co-authored-by: Kaeden Murphy <kmurphy@kaedenmurphy.dev> Co-authored-by: triphora <emmaffle@modrinth.com> Co-authored-by: Zach Baird <30800863+ZachBaird@users.noreply.github.com> Co-authored-by: stairman06 <36215135+stairman06@users.noreply.github.com> Co-authored-by: Zachary Baird <zdb1994@yahoo.com> Co-authored-by: Magnus Jensen <magnushjensen.mail@gmail.com> Co-authored-by: MagnusHJensen <magnus.holm.jensen@lego.dk>
212 lines
5.5 KiB
Vue
212 lines
5.5 KiB
Vue
<template>
|
|
<Modal ref="modal" :header="'Transfer to ' + $formatWallet(wallet)">
|
|
<div class="modal-transfer">
|
|
<span
|
|
>You are initiating a transfer of your revenue from Modrinth's Creator Monetization Program.
|
|
How much of your <strong>{{ $formatMoney(balance) }}</strong> balance would you like to
|
|
transfer?</span
|
|
>
|
|
<div class="confirmation-input">
|
|
<input
|
|
id="confirmation"
|
|
v-model="amount"
|
|
type="text"
|
|
pattern="^\d*(\.\d{0,2})?$"
|
|
autocomplete="off"
|
|
placeholder="Amount to transfer..."
|
|
/>
|
|
</div>
|
|
<div class="confirm-text">
|
|
<Checkbox
|
|
v-if="isValidInput() && parseInput() >= minWithdraw && parseInput() <= balance"
|
|
v-model="consentedFee"
|
|
description="Consent to fee"
|
|
>
|
|
<template v-if="wallet === 'venmo'">
|
|
I acknowledge that $0.25 will be deducted from the amount I receive to cover
|
|
{{ $formatWallet(wallet) }} processing fees.
|
|
</template>
|
|
<template v-else>
|
|
I acknowledge that an estimated
|
|
{{ $formatMoney(calcProcessingFees()) }} will be deducted from the amount I receive to
|
|
cover {{ $formatWallet(wallet) }} processing fees and that any excess will be returned
|
|
to my Modrinth balance.
|
|
</template>
|
|
</Checkbox>
|
|
<Checkbox
|
|
v-if="isValidInput() && parseInput() >= minWithdraw && parseInput() <= balance"
|
|
v-model="consentedAccount"
|
|
description="Confirm transfer"
|
|
>
|
|
I confirm that I an initiating a transfer to the following
|
|
{{ $formatWallet(wallet) }} account: {{ account }}
|
|
</Checkbox>
|
|
<span v-else-if="validInput && parseInput() < minWithdraw" class="invalid">
|
|
The amount must be at least {{ $formatMoney(minWithdraw) }}</span
|
|
>
|
|
<span v-else-if="validInput && parseInput() > balance" class="invalid">
|
|
The amount must be no more than {{ $formatMoney(balance) }}</span
|
|
>
|
|
<span v-else-if="amount.length > 0" class="invalid">
|
|
{{ amount }} is not a valid amount</span
|
|
>
|
|
</div>
|
|
<div class="button-group">
|
|
<NuxtLink class="iconified-button" to="/settings/monetization">
|
|
<SettingsIcon /> Monetization settings
|
|
</NuxtLink>
|
|
<button class="iconified-button" @click="cancel">
|
|
<CrossIcon />
|
|
Cancel
|
|
</button>
|
|
<button
|
|
class="iconified-button brand-button"
|
|
:disabled="!consentedFee || !consentedAccount"
|
|
@click="proceed"
|
|
>
|
|
<TransferIcon />
|
|
Transfer
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</Modal>
|
|
</template>
|
|
|
|
<script>
|
|
import CrossIcon from '~/assets/images/utils/x.svg'
|
|
import TransferIcon from '~/assets/images/utils/transfer.svg'
|
|
import SettingsIcon from '~/assets/images/utils/settings.svg'
|
|
import Modal from '~/components/ui/Modal'
|
|
import Checkbox from '~/components/ui/Checkbox'
|
|
|
|
export default {
|
|
components: {
|
|
Checkbox,
|
|
CrossIcon,
|
|
SettingsIcon,
|
|
TransferIcon,
|
|
Modal,
|
|
},
|
|
props: {
|
|
wallet: {
|
|
type: String,
|
|
required: true,
|
|
},
|
|
accountType: {
|
|
type: String,
|
|
required: true,
|
|
},
|
|
account: {
|
|
type: String,
|
|
required: true,
|
|
},
|
|
balance: {
|
|
type: Number,
|
|
required: true,
|
|
},
|
|
minWithdraw: {
|
|
type: Number,
|
|
required: true,
|
|
},
|
|
},
|
|
data() {
|
|
return {
|
|
consentedFee: false,
|
|
consentedAccount: false,
|
|
amount: '',
|
|
validInput: false,
|
|
}
|
|
},
|
|
methods: {
|
|
cancel() {
|
|
this.amount = ''
|
|
this.consentedFee = false
|
|
this.consentedAccount = false
|
|
this.validInput = false
|
|
this.$refs.modal.hide()
|
|
},
|
|
async proceed() {
|
|
startLoading()
|
|
try {
|
|
await useBaseFetch(`user/${this.$auth.user.id}/payouts`, {
|
|
method: 'POST',
|
|
body: {
|
|
amount: Number(this.amount.replace('$', '')),
|
|
},
|
|
...this.$defaultHeaders(),
|
|
})
|
|
await useAuth(this.$auth.token)
|
|
|
|
this.$refs.modal.hide()
|
|
} catch (err) {
|
|
this.$notify({
|
|
group: 'main',
|
|
title: 'An error occurred',
|
|
text: err.data.description,
|
|
type: 'error',
|
|
})
|
|
}
|
|
stopLoading()
|
|
},
|
|
show() {
|
|
this.$refs.modal.show()
|
|
},
|
|
isValidInput() {
|
|
const regex = /^\$?(\d*(\.\d{2})?)$/gm
|
|
this.validInput = regex.test(this.amount) && this.amount.length > 0
|
|
return this.validInput
|
|
},
|
|
parseInput() {
|
|
const regex = /^\$?(\d*(\.\d{2})?)$/gm
|
|
const matches = regex.exec(this.amount)
|
|
return parseFloat(matches[1])
|
|
},
|
|
calcProcessingFees() {
|
|
if (this.wallet === 'venmo') {
|
|
return 0.25
|
|
} else {
|
|
return Math.max(0.25, Math.min(this.parseInput() * 0.02, 20))
|
|
}
|
|
},
|
|
},
|
|
}
|
|
</script>
|
|
|
|
<style scoped lang="scss">
|
|
.modal-transfer {
|
|
padding: var(--spacing-card-bg);
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: var(--spacing-card-sm);
|
|
|
|
.confirmation-input {
|
|
input {
|
|
width: 14rem;
|
|
max-width: 100%;
|
|
}
|
|
}
|
|
|
|
.button-group {
|
|
margin-top: var(--spacing-card-md);
|
|
justify-content: right;
|
|
}
|
|
|
|
strong {
|
|
color: var(--color-text-dark);
|
|
font-weight: 500;
|
|
}
|
|
|
|
.invalid {
|
|
color: var(--color-special-red);
|
|
}
|
|
|
|
.confirm-text {
|
|
margin-top: var(--spacing-card-sm);
|
|
min-height: 7rem;
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: var(--spacing-card-sm);
|
|
}
|
|
}
|
|
</style>
|