Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion apps/app-frontend/src/App.vue
Original file line number Diff line number Diff line change
Expand Up @@ -51,9 +51,10 @@ import {
providePageContext,
providePopupNotificationManager,
useDebugLogger,
useFormatBytes,
useVIntl,
} from '@modrinth/ui'
import { formatBytes, renderString } from '@modrinth/utils'
import { renderString } from '@modrinth/utils'
import { useQuery, useQueryClient } from '@tanstack/vue-query'
import { getVersion } from '@tauri-apps/api/app'
import { invoke } from '@tauri-apps/api/core'
Expand Down Expand Up @@ -261,6 +262,8 @@ onUnmounted(async () => {
})

const { formatMessage } = useVIntl()
const formatBytes = useFormatBytes()

const messages = defineMessages({
updateInstalledToastTitle: {
id: 'app.update.complete-toast.title',
Expand Down
4 changes: 3 additions & 1 deletion apps/app-frontend/src/pages/project/Version.vue
Original file line number Diff line number Diff line change
Expand Up @@ -176,9 +176,10 @@ import {
ButtonStyled,
Card,
CopyCode,
useFormatBytes,
useFormatDateTime,
} from '@modrinth/ui'
import { formatBytes, renderString } from '@modrinth/utils'
import { renderString } from '@modrinth/utils'
import { computed, ref, watch } from 'vue'
import { useRoute } from 'vue-router'

Expand All @@ -191,6 +192,7 @@ const formatDateTime = useFormatDateTime({
timeStyle: 'short',
dateStyle: 'long',
})
const formatBytes = useFormatBytes()

const breadcrumbs = useBreadcrumbs()

Expand Down
108 changes: 47 additions & 61 deletions apps/frontend/src/components/ui/FileInput.vue
Original file line number Diff line number Diff line change
Expand Up @@ -17,74 +17,60 @@
</label>
</template>

<script>
import { fileIsValid } from '~/helpers/fileUtils.js'
<script setup lang="ts">
import { useFormatBytes } from '@modrinth/ui'
import { fileIsValid } from '@modrinth/utils'
import { ref } from 'vue'

export default {
components: {},
props: {
prompt: {
type: String,
default: 'Select file',
},
multiple: {
type: Boolean,
default: false,
},
accept: {
type: String,
default: null,
},
const props = withDefaults(
defineProps<{
prompt?: string
multiple?: boolean
accept?: string
/**
* The max file size in bytes
*/
maxSize: {
type: Number,
default: null,
},
showIcon: {
type: Boolean,
default: true,
},
shouldAlwaysReset: {
type: Boolean,
default: false,
},
longStyle: {
type: Boolean,
default: false,
},
disabled: {
type: Boolean,
default: false,
},
maxSize?: number | null
showIcon?: boolean
shouldAlwaysReset?: boolean
longStyle?: boolean
disabled?: boolean
}>(),
{
prompt: 'Select file',
multiple: false,
showIcon: true,
shouldAlwaysReset: false,
longStyle: false,
disabled: false,
},
emits: ['change'],
data() {
return {
files: [],
}
},
methods: {
addFiles(files, shouldNotReset) {
if (!shouldNotReset || this.shouldAlwaysReset) {
this.files = files
}
)

const validationOptions = { maxSize: this.maxSize, alertOnInvalid: true }
this.files = [...this.files].filter((file) => fileIsValid(file, validationOptions))
const emit = defineEmits<{ change: [files: File[]] }>()

if (this.files.length > 0) {
this.$emit('change', this.files)
}
},
handleDrop(e) {
this.addFiles(e.dataTransfer.files)
},
handleChange(e) {
this.addFiles(e.target.files)
},
},
const formatBytes = useFormatBytes()

const files = ref<File[]>([])

function addFiles(incoming: FileList, shouldNotReset = false) {
if (!shouldNotReset || props.shouldAlwaysReset) {
files.value = Array.from(incoming)
}
const validationOptions = { maxSize: props.maxSize, alertOnInvalid: true }
files.value = files.value.filter((file) => fileIsValid(file, validationOptions, formatBytes))
if (files.value.length > 0) {
emit('change', files.value)
}
}

function handleDrop(e: DragEvent) {
addFiles(e.dataTransfer!.files)
}

function handleChange(e: Event) {
const input = e.target as HTMLInputElement
if (!input.files) return
addFiles(input.files)
}
</script>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ import {
injectNotificationManager,
OverflowMenu,
type OverflowMenuOption,
useFormatBytes,
useFormatDateTime,
} from '@modrinth/ui'
import { NavTabs } from '@modrinth/ui'
Expand Down Expand Up @@ -56,6 +57,7 @@ const formatDateTimeUtc = useFormatDateTime({
timeZoneName: 'short',
timeZone: 'UTC',
})
const formatBytes = useFormatBytes()

type FlattenedFileReport = Labrinth.TechReview.Internal.FileReport & {
id: string
Expand Down Expand Up @@ -362,12 +364,6 @@ const formattedDate = computed(() => {
return `${diffDays} days ago`
})

function formatFileSize(bytes: number): string {
if (bytes < 1024) return `${bytes} B`
if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(2)} KiB`
return `${(bytes / (1024 * 1024)).toFixed(2)} MiB`
}

function viewFileFlags(file: FlattenedFileReport) {
selectedFileId.value = file.id
currentTab.value = 'File'
Expand Down Expand Up @@ -851,7 +847,7 @@ const reviewSummaryPreview = computed(() => {
const fileVerdict = fileUnsafe > 0 ? 'Unsafe' : 'Safe'

markdown += `### ${fileData.fileName}\n`
markdown += `> ${formatFileSize(fileData.fileSize)} • ${fileData.decisions.length} issues • Max severity: ${fileData.maxSeverity} • **Verdict:** ${fileVerdict}\n\n`
markdown += `> ${formatBytes(fileData.fileSize)} • ${fileData.decisions.length} issues • Max severity: ${fileData.maxSeverity} • **Verdict:** ${fileVerdict}\n\n`
markdown += `<details>\n<summary>Issues (${fileSafe} safe, ${fileUnsafe} unsafe)</summary>\n\n`
markdown += `| Class | Issue Type | Severity | Decision |\n`
markdown += `|-------|------------|----------|----------|\n`
Expand Down Expand Up @@ -1150,7 +1146,7 @@ async function handleSubmitReview(verdict: 'safe' | 'unsafe') {
</span>
<div class="rounded-full border border-solid border-surface-5 bg-surface-3 px-2.5 py-1">
<span class="text-sm font-medium text-secondary">{{
formatFileSize(file.file_size)
formatBytes(file.file_size)
}}</span>
</div>
<div
Expand Down
32 changes: 0 additions & 32 deletions apps/frontend/src/helpers/fileUtils.js

This file was deleted.

9 changes: 8 additions & 1 deletion apps/frontend/src/pages/[type]/[id]/settings/index.vue
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,11 @@
const input = e.target
if (input.files?.length) {
if (
fileIsValid(input.files[0], { maxSize: 524288000, alertOnInvalid: true })
fileIsValid(
input.files[0],
{ maxSize: 524288000, alertOnInvalid: true },
formatBytes,
)
)
showBannerPreview(Array.from(input.files))
}
Expand Down Expand Up @@ -379,6 +383,7 @@ import {
StyledInput,
Toggle,
UnsavedChangesPopup,
useFormatBytes,
usePageLeaveSafety,
} from '@modrinth/ui'
import { fileIsValid, formatProjectStatus, formatProjectType } from '@modrinth/utils'
Expand All @@ -405,6 +410,8 @@ const flags = useFeatureFlags()
const tags = useGeneratedState()
const router = useNativeRouter()

const formatBytes = useFormatBytes()

const name = ref(project.value.title)
const slug = ref(project.value.slug)
const summary = ref(project.value.description)
Expand Down
4 changes: 3 additions & 1 deletion apps/frontend/src/pages/[type]/[id]/version/[version].vue
Original file line number Diff line number Diff line change
Expand Up @@ -436,9 +436,10 @@ import {
injectProjectPageContext,
MultiSelect,
StyledInput,
useFormatBytes,
useFormatDateTime,
} from '@modrinth/ui'
import { formatBytes, renderHighlightedString } from '@modrinth/utils'
import { renderHighlightedString } from '@modrinth/utils'

import Breadcrumbs from '~/components/ui/Breadcrumbs.vue'
import CreateProjectVersionModal from '~/components/ui/create-project-version/CreateProjectVersionModal.vue'
Expand Down Expand Up @@ -466,6 +467,7 @@ const formatDateTime = useFormatDateTime({
dateStyle: 'long',
})
const formatDate = useFormatDateTime({ dateStyle: 'medium' })
const formatBytes = useFormatBytes()

// Helper for accessing nuxt app $formatVersion
const formatVersionDisplay = (versions: string[]) => (data as any).$formatVersion(versions)
Expand Down
12 changes: 10 additions & 2 deletions apps/frontend/src/pages/admin/file_lookup.vue
Original file line number Diff line number Diff line change
Expand Up @@ -81,11 +81,19 @@

<script setup lang="ts">
import { FileIcon, SpinnerIcon, UploadIcon } from '@modrinth/assets'
import { Admonition, Avatar, CopyCode, injectNotificationManager } from '@modrinth/ui'
import { formatBytes, type Project, type Version } from '@modrinth/utils'
import {
Admonition,
Avatar,
CopyCode,
injectNotificationManager,
useFormatBytes,
} from '@modrinth/ui'
import type { Project, Version } from '@modrinth/utils'

const { addNotification } = injectNotificationManager()

const formatBytes = useFormatBytes()

const fileInput = ref<HTMLInputElement>()
const selectedFile = ref<File | null>(null)
const fileHashes = ref<{
Expand Down
5 changes: 4 additions & 1 deletion packages/ui/src/components/base/AppearingProgressBar.vue
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,10 @@
</template>

<script setup lang="ts">
import { formatBytes } from '@modrinth/utils'
import { computed, onUnmounted, ref, watch } from 'vue'

import { useFormatBytes } from '#ui/composables'

interface Props {
maxValue: number
currentValue: number
Expand All @@ -59,6 +60,8 @@ const props = withDefaults(defineProps<Props>(), {
],
})

const formatBytes = useFormatBytes()

const currentPhrase = ref('')
const usedPhrases = ref(new Set<number>())
let phraseInterval: NodeJS.Timeout | null = null
Expand Down
5 changes: 4 additions & 1 deletion packages/ui/src/components/base/DropzoneFileInput.vue
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ import { FolderUpIcon } from '@modrinth/assets'
import { fileIsValid } from '@modrinth/utils'
import { ref } from 'vue'

import { useFormatBytes } from '../../composables'
import { injectNotificationManager } from '../../providers'

const { addNotification } = injectNotificationManager()
Expand Down Expand Up @@ -78,6 +79,8 @@ const props = withDefaults(
},
)

const formatBytes = useFormatBytes()

const files = ref<File[]>([])

function matchesAccept(file: File, accept?: string): boolean {
Expand Down Expand Up @@ -129,7 +132,7 @@ function addFiles(incoming: FileList, shouldNotReset = false) {
alertOnInvalid: true,
}

files.value = files.value.filter((file) => fileIsValid(file, validationOptions))
files.value = files.value.filter((file) => fileIsValid(file, validationOptions, formatBytes))

if (files.value.length > 0) {
emit('change', files.value)
Expand Down
Loading