diff options
Diffstat (limited to 'packages/frontend/src/ui/deck')
| -rw-r--r-- | packages/frontend/src/ui/deck/channel-column.vue | 71 | ||||
| -rw-r--r-- | packages/frontend/src/ui/deck/column-core.vue | 2 | ||||
| -rw-r--r-- | packages/frontend/src/ui/deck/deck-store.ts | 3 |
3 files changed, 75 insertions, 1 deletions
diff --git a/packages/frontend/src/ui/deck/channel-column.vue b/packages/frontend/src/ui/deck/channel-column.vue new file mode 100644 index 0000000000..5a84237c80 --- /dev/null +++ b/packages/frontend/src/ui/deck/channel-column.vue @@ -0,0 +1,71 @@ +<template> +<XColumn :menu="menu" :column="column" :is-stacked="isStacked" @parent-focus="$event => emit('parent-focus', $event)"> + <template #header> + <i class="ti ti-device-tv"></i><span style="margin-left: 8px;">{{ column.name }}</span> + </template> + + <template v-if="column.channelId"> + <div style="padding: 8px; text-align: center;"> + <MkButton primary gradate rounded inline @click="post"><i class="ti ti-pencil"></i></MkButton> + </div> + <XTimeline ref="timeline" src="channel" :channel="column.channelId" @after="() => emit('loaded')"/> + </template> +</XColumn> +</template> + +<script lang="ts" setup> +import { } from 'vue'; +import XColumn from './column.vue'; +import { updateColumn, Column } from './deck-store'; +import XTimeline from '@/components/MkTimeline.vue'; +import MkButton from '@/components/MkButton.vue'; +import * as os from '@/os'; +import { i18n } from '@/i18n'; + +const props = defineProps<{ + column: Column; + isStacked: boolean; +}>(); + +const emit = defineEmits<{ + (ev: 'loaded'): void; + (ev: 'parent-focus', direction: 'up' | 'down' | 'left' | 'right'): void; +}>(); + +let timeline = $shallowRef<InstanceType<typeof XTimeline>>(); + +if (props.column.channelId == null) { + setChannel(); +} + +async function setChannel() { + const channels = await os.api('channels/followed'); + const { canceled, result: channel } = await os.select({ + title: i18n.ts.selectChannel, + items: channels.map(x => ({ + value: x, text: x.name, + })), + default: props.column.channelId, + }); + if (canceled) return; + updateColumn(props.column.id, { + channelId: channel.id, + name: channel.name, + }); +} + +function post() { + os.post({ + channel: { + id: props.column.channelId, + }, + instant: true, + }); +} + +const menu = [{ + icon: 'ti ti-pencil', + text: i18n.ts.selectChannel, + action: setChannel, +}]; +</script> diff --git a/packages/frontend/src/ui/deck/column-core.vue b/packages/frontend/src/ui/deck/column-core.vue index 30c0dc5e1c..083e91bb03 100644 --- a/packages/frontend/src/ui/deck/column-core.vue +++ b/packages/frontend/src/ui/deck/column-core.vue @@ -6,6 +6,7 @@ <XNotificationsColumn v-else-if="column.type === 'notifications'" :column="column" :is-stacked="isStacked" @parent-focus="emit('parent-focus', $event)"/> <XTlColumn v-else-if="column.type === 'tl'" :column="column" :is-stacked="isStacked" @parent-focus="emit('parent-focus', $event)"/> <XListColumn v-else-if="column.type === 'list'" :column="column" :is-stacked="isStacked" @parent-focus="emit('parent-focus', $event)"/> +<XChannelColumn v-else-if="column.type === 'channel'" :column="column" :is-stacked="isStacked" @parent-focus="emit('parent-focus', $event)"/> <XAntennaColumn v-else-if="column.type === 'antenna'" :column="column" :is-stacked="isStacked" @parent-focus="emit('parent-focus', $event)"/> <XMentionsColumn v-else-if="column.type === 'mentions'" :column="column" :is-stacked="isStacked" @parent-focus="emit('parent-focus', $event)"/> <XDirectColumn v-else-if="column.type === 'direct'" :column="column" :is-stacked="isStacked" @parent-focus="emit('parent-focus', $event)"/> @@ -17,6 +18,7 @@ import XMainColumn from './main-column.vue'; import XTlColumn from './tl-column.vue'; import XAntennaColumn from './antenna-column.vue'; import XListColumn from './list-column.vue'; +import XChannelColumn from './channel-column.vue'; import XNotificationsColumn from './notifications-column.vue'; import XWidgetsColumn from './widgets-column.vue'; import XMentionsColumn from './mentions-column.vue'; diff --git a/packages/frontend/src/ui/deck/deck-store.ts b/packages/frontend/src/ui/deck/deck-store.ts index 56db7398e5..80c202a2ef 100644 --- a/packages/frontend/src/ui/deck/deck-store.ts +++ b/packages/frontend/src/ui/deck/deck-store.ts @@ -14,7 +14,7 @@ type ColumnWidget = { export type Column = { id: string; - type: 'main' | 'widgets' | 'notifications' | 'tl' | 'antenna' | 'list' | 'mentions' | 'direct'; + type: 'main' | 'widgets' | 'notifications' | 'tl' | 'antenna' | 'channel' | 'list' | 'mentions' | 'direct'; name: string | null; width: number; widgets?: ColumnWidget[]; @@ -22,6 +22,7 @@ export type Column = { flexible?: boolean; antennaId?: string; listId?: string; + channelId?: string; includingTypes?: typeof notificationTypes[number][]; tl?: 'home' | 'local' | 'social' | 'global'; }; |