summaryrefslogtreecommitdiff
path: root/packages/frontend/src/ui/deck
diff options
context:
space:
mode:
Diffstat (limited to 'packages/frontend/src/ui/deck')
-rw-r--r--packages/frontend/src/ui/deck/channel-column.vue71
-rw-r--r--packages/frontend/src/ui/deck/column-core.vue2
-rw-r--r--packages/frontend/src/ui/deck/deck-store.ts3
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';
};