123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- <script setup lang="ts">
- import { defineAsyncComponent, ref, onBeforeUnmount } from "vue";
- import Toast from "toasters";
- import { storeToRefs } from "pinia";
- import validation from "@/validation";
- import { useWebsocketsStore } from "@/stores/websockets";
- import { useModalsStore } from "@/stores/modals";
- import { useUserPreferencesStore } from "@/stores/userPreferences";
- const Modal = defineAsyncComponent(() => import("@/components/Modal.vue"));
- const props = defineProps({
- modalUuid: { type: String, required: true },
- admin: { type: Boolean, default: false }
- });
- const { openModal, closeCurrentModal } = useModalsStore();
- const { socket } = useWebsocketsStore();
- const userPreferencesStore = useUserPreferencesStore();
- const { defaultPlaylistPrivacy } = storeToRefs(userPreferencesStore);
- const playlist = ref({
- displayName: "",
- privacy: defaultPlaylistPrivacy.value,
- songs: []
- });
- const createPlaylist = () => {
- const { displayName } = playlist.value;
- if (!validation.isLength(displayName, 1, 64))
- return new Toast("Display name must have between 1 and 64 characters.");
- if (!validation.regex.ascii.test(displayName))
- return new Toast(
- "Invalid display name format. Only ASCII characters are allowed."
- );
- return socket.dispatch(
- "playlists.create",
- { ...playlist.value, admin: props.admin },
- res => {
- new Toast(res.message);
- if (res.status === "success") {
- closeCurrentModal();
- if (!window.addToPlaylistDropdown) {
- openModal({
- modal: "editPlaylist",
- props: { playlistId: res.data.playlistId }
- });
- }
- }
- }
- );
- };
- onBeforeUnmount(() => {
- if (window.addToPlaylistDropdown)
- window.addToPlaylistDropdown.tippy.setProps({
- zIndex: 9999,
- hideOnClick: true
- });
- window.addToPlaylistDropdown = null;
- });
- </script>
- <template>
- <modal
- :title="admin ? 'Create Admin Playlist' : 'Create Playlist'"
- :size="'slim'"
- >
- <template #body>
- <p class="control is-expanded">
- <label class="label">Display Name</label>
- <input
- v-model="playlist.displayName"
- class="input"
- type="text"
- placeholder="Enter display name..."
- autofocus
- @keyup.enter="createPlaylist()"
- />
- </p>
- <div class="control" id="privacy-selection">
- <label class="label">Privacy</label>
- <p class="control is-expanded select">
- <select v-model="playlist.privacy">
- <option value="private">Private</option>
- <option value="public" selected>Public</option>
- </select>
- </p>
- </div>
- </template>
- <template #footer>
- <a class="button is-info" @click="createPlaylist()"
- ><i class="material-icons icon-with-button">create</i>Create
- Playlist</a
- >
- </template>
- </modal>
- </template>
|