diff --git a/app/src/components/v-error/v-error.vue b/app/src/components/v-error/v-error.vue
index 684571902c..e16d1dd159 100644
--- a/app/src/components/v-error/v-error.vue
+++ b/app/src/components/v-error/v-error.vue
@@ -2,7 +2,7 @@
!!navigator.clipboard?.writeText);
+ const { isCopySupported, copyToClipboard } = useClipboard();
- return { t, code, copyError, showCopy, copied, message };
+ return { t, code, copyError, isCopySupported, copied, message };
async function copyError() {
const error = props.error?.response?.data || props.error;
- await navigator.clipboard.writeText(
+ const isCopied = await copyToClipboard(
JSON.stringify(error, isPlainObject(error) ? null : Object.getOwnPropertyNames(error), 2)
);
+ if (!isCopied) return;
copied.value = true;
}
},
diff --git a/app/src/components/v-form/form-field-menu.vue b/app/src/components/v-form/form-field-menu.vue
index f99751c79e..309d992cd5 100644
--- a/app/src/components/v-form/form-field-menu.vue
+++ b/app/src/components/v-form/form-field-menu.vue
@@ -51,6 +51,7 @@
import { useI18n } from 'vue-i18n';
import { defineComponent, PropType, computed } from 'vue';
import { Field } from '@directus/shared/types';
+import useClipboard from '@/composables/use-clipboard';
export default defineComponent({
props: {
@@ -75,6 +76,8 @@ export default defineComponent({
setup(props) {
const { t } = useI18n();
+ const { isCopySupported, isPasteSupported } = useClipboard();
+
const defaultValue = computed(() => {
const savedValue = props.field?.schema?.default_value;
return savedValue !== undefined ? savedValue : null;
@@ -84,14 +87,6 @@ export default defineComponent({
return props.field?.schema?.is_nullable === false;
});
- const isCopySupported = computed(() => {
- return !!navigator?.clipboard?.writeText;
- });
-
- const isPasteSupported = computed(() => {
- return !!navigator?.clipboard?.readText;
- });
-
return { t, defaultValue, isRequired, isCopySupported, isPasteSupported };
},
});
diff --git a/app/src/components/v-form/form-field.vue b/app/src/components/v-form/form-field.vue
index f20de34165..fc0571268c 100644
--- a/app/src/components/v-form/form-field.vue
+++ b/app/src/components/v-form/form-field.vue
@@ -69,7 +69,6 @@
diff --git a/app/src/views/private/components/shares-sidebar-detail/shares-sidebar-detail.vue b/app/src/views/private/components/shares-sidebar-detail/shares-sidebar-detail.vue
index 44285e8da6..0fd91119e2 100644
--- a/app/src/views/private/components/shares-sidebar-detail/shares-sidebar-detail.vue
+++ b/app/src/views/private/components/shares-sidebar-detail/shares-sidebar-detail.vue
@@ -80,8 +80,8 @@ import { defineComponent, ref, computed } from 'vue';
import DrawerItem from '@/views/private/components/drawer-item';
import { getRootPath } from '@/utils/get-root-path';
import { unexpectedError } from '@/utils/unexpected-error';
-import { notify } from '@/utils/notify';
import { Share } from '@directus/shared/types';
+import useClipboard from '@/composables/use-clipboard';
import api from '@/api';
import ShareItem from './share-item.vue';
@@ -105,6 +105,8 @@ export default defineComponent({
setup(props) {
const { t } = useI18n();
+ const { copyToClipboard } = useClipboard();
+
const shares = ref(null);
const count = ref(0);
const error = ref(null);
@@ -168,17 +170,7 @@ export default defineComponent({
async function copy(id: string) {
const url = window.location.origin + getRootPath() + 'admin/shared/' + id;
- try {
- await navigator?.clipboard?.writeText(url);
- notify({
- title: t('share_copy_link_success'),
- });
- } catch (err: any) {
- notify({
- type: 'error',
- title: t('share_copy_link_error'),
- });
- }
+ await copyToClipboard(url, { success: t('share_copy_link_success'), fail: t('share_copy_link_error') });
}
function select(id: string) {