diff --git a/packages/pl-api/lib/client.ts b/packages/pl-api/lib/client.ts index 97f49b843..0f70aff84 100644 --- a/packages/pl-api/lib/client.ts +++ b/packages/pl-api/lib/client.ts @@ -5952,7 +5952,7 @@ class PlApiClient { return v.parse(driveFileSchema, response.json); }, - createFile: async (file: File, folderId: string) => { + createFile: async (file: File, folderId?: string) => { await this.#getIceshrimpAccessToken(); const response = await this.request('/api/iceshrimp/drive', { @@ -5968,7 +5968,7 @@ class PlApiClient { await this.#getIceshrimpAccessToken(); const response = await this.request(`/api/iceshrimp/drive/${id}`, { - method: 'PUT', + method: 'PATCH', body: params, }); @@ -5993,7 +5993,7 @@ class PlApiClient { body: { folderId: targetFolderId }, }); - return v.parse(driveFolderSchema, response.json); + return v.parse(driveFileSchema, response.json); }, }; diff --git a/packages/pl-api/lib/params/index.ts b/packages/pl-api/lib/params/index.ts index 33844c6da..8ed232252 100644 --- a/packages/pl-api/lib/params/index.ts +++ b/packages/pl-api/lib/params/index.ts @@ -4,6 +4,7 @@ export * from './apps'; export * from './chats'; export * from './circles'; export type { PaginationParams } from './common'; +export * from './drive'; export * from './events'; export * from './filtering'; export * from './grouped-notifications'; diff --git a/packages/pl-fe/src/features/ui/index.tsx b/packages/pl-fe/src/features/ui/index.tsx index 45d96af9a..7d1329782 100644 --- a/packages/pl-fe/src/features/ui/index.tsx +++ b/packages/pl-fe/src/features/ui/index.tsx @@ -151,6 +151,7 @@ import { Privacy, UserIndex, WrenchedTimeline, + Drive, } from './util/async-components'; import GlobalHotkeys from './util/global-hotkeys'; import { WrappedRoute } from './util/react-router-helpers'; @@ -315,6 +316,8 @@ const SwitchingColumnsArea: React.FC = React.memo(({ chil {features.scheduledStatuses && } + {features.drive && } + diff --git a/packages/pl-fe/src/features/ui/util/async-components.ts b/packages/pl-fe/src/features/ui/util/async-components.ts index 103db653a..1477abf59 100644 --- a/packages/pl-fe/src/features/ui/util/async-components.ts +++ b/packages/pl-fe/src/features/ui/util/async-components.ts @@ -29,6 +29,7 @@ export const Directory = lazy(() => import('pl-fe/pages/account-lists/directory' export const DomainBlocks = lazy(() => import('pl-fe/pages/settings/domain-blocks')); export const Domains = lazy(() => import('pl-fe/pages/dashboard/domains')); export const DraftStatuses = lazy(() => import('pl-fe/pages/status-lists/draft-statuses')); +export const Drive = lazy(() => import('pl-fe/pages/drive/drive')); export const EditEmail = lazy(() => import('pl-fe/pages/settings/edit-email')); export const EditFilter = lazy(() => import('pl-fe/pages/settings/edit-filter')); export const EditGroup = lazy(() => import('pl-fe/pages/groups/edit-group')); diff --git a/packages/pl-fe/src/locales/en.json b/packages/pl-fe/src/locales/en.json index 2d3f67f42..53b233185 100644 --- a/packages/pl-fe/src/locales/en.json +++ b/packages/pl-fe/src/locales/en.json @@ -405,6 +405,7 @@ "column.dislikes": "Dislikes", "column.domain_blocks": "Hidden domains", "column.draft_statuses": "Drafts", + "column.drive": "Drive", "column.edit_profile": "Edit profile", "column.event_map": "Event location", "column.event_participants": "Event participants", @@ -708,6 +709,44 @@ "directory.recently_active": "Recently active", "draft_status.cancel": "Delete", "draft_status.edit": "Edit", + "drive.empty": "There are no files or folders in this folder.", + "drive.file.delete": "Delete file", + "drive.file.delete.confirm": "Delete", + "drive.file.delete.error": "Failed to delete file.", + "drive.file.delete.success": "File deleted successfully.", + "drive.file.delete.text": "Are you sure you want to delete this file? This action cannot be undone.", + "drive.file.download": "Download file", + "drive.file.dropdown": "File menu", + "drive.file.mark_sensitive": "Mark as sensitive", + "drive.file.mark_sensitive.error": "Failed to mark file as sensitive.", + "drive.file.mark_sensitive.success": "File marked as sensitive.", + "drive.file.move": "Move file", + "drive.file.rename": "Rename file", + "drive.file.rename.confirm": "Rename", + "drive.file.rename.error": "Failed to rename file.", + "drive.file.rename.placeholder": "New file name", + "drive.file.rename.success": "File renamed successfully.", + "drive.file.unmark_sensitive": "Unmark as sensitive", + "drive.file.unmark_sensitive.error": "Failed to unmark file as sensitive.", + "drive.file.unmark_sensitive.success": "File unmarked as sensitive.", + "drive.file.update_description": "Edit description", + "drive.file.update_description.confirm": "Save", + "drive.file.update_description.error": "Failed to update description.", + "drive.file.update_description.placeholder": "New description", + "drive.file.update_description.success": "Description updated successfully.", + "drive.file.view": "View file", + "drive.folder.delete": "Delete folder", + "drive.folder.delete.confirm": "Delete", + "drive.folder.delete.error": "Failed to delete folder.", + "drive.folder.delete.success": "Folder deleted successfully.", + "drive.folder.delete.text": "Are you sure you want to delete this folder? This action cannot be undone.", + "drive.folder.dropdown": "Folder menu", + "drive.folder.rename": "Rename folder", + "drive.folder.rename.confirm": "Rename", + "drive.folder.rename.error": "Failed to rename folder.", + "drive.folder.rename.placeholder": "New folder name", + "drive.folder.rename.success": "Folder renamed successfully.", + "drive.folder.view": "View folder", "edit_bookmark_folder_modal.confirm": "Save", "edit_bookmark_folder_modal.header_title": "Edit folder", "edit_email.header": "Change email", diff --git a/packages/pl-fe/src/modals/text-field-modal.tsx b/packages/pl-fe/src/modals/text-field-modal.tsx index bb380f72a..8aa71cb2f 100644 --- a/packages/pl-fe/src/modals/text-field-modal.tsx +++ b/packages/pl-fe/src/modals/text-field-modal.tsx @@ -1,6 +1,7 @@ import React, { useState } from 'react'; import { FormattedMessage } from 'react-intl'; +import Input from 'pl-fe/components/ui/input'; import Modal from 'pl-fe/components/ui/modal'; import Stack from 'pl-fe/components/ui/stack'; import Textarea from 'pl-fe/components/ui/textarea'; @@ -16,6 +17,7 @@ interface TextFieldModalProps { onCancel?: () => void; confirmationTheme?: ButtonThemes; text?: string; + singleLine?: boolean; } const TextFieldModal: React.FC = ({ @@ -27,6 +29,7 @@ const TextFieldModal: React.FC = ({ onCancel, confirmationTheme, text, + singleLine, }) => { const [value, setValue] = useState(text || ''); @@ -50,12 +53,22 @@ const TextFieldModal: React.FC = ({ cancelAction={handleCancel} > -