import preview from "../../../.storybook/preview.js";
import React from 'react';
import { http, HttpResponse, sse } from 'msw';
import { Container } from '@chakra-ui/react';
import { ChakraPlayer, ChakraPlayerFetchable } from "../../client/components/chakraPlayer/Player.js";
import {Provider} from "../../client/components/Provider.js";
import { generateSourcePlayerJson } from "../../core/tests/utils/apiFixtures.js";
import type {MsSseEvent} from "../../core/Api.js";
import { SSEProvider } from "@flamefrontend/sse-runtime-react";
import { sseProviderOptions } from "../../client/App.js";
import dayjs from "dayjs";
import { asJsonPlayObject } from "../../core/PlayMarshalUtils.js";
import { generatePlay } from "../../core/tests/utils/PlayTestUtils.js";
// More on how to set up stories at: https://storybook.js.org/docs/writing-stories#default-export
const meta = preview.meta({
title: 'Component/Player',
component: ChakraPlayer,
parameters: {
// Optional parameter to center the component in the Canvas. More info: https://storybook.js.org/docs/configure/story-layout
layout: 'padded',
},
// This component will have an automatically generated Autodocs entry: https://storybook.js.org/docs/writing-docs/autodocs
tags: ['autodocs'],
// More on argTypes: https://storybook.js.org/docs/api/argtypes
// args: {
// data: generatePlayApiCommonDetailed(),
// },
// argTypes: {
// componentType: {
// control: { type: 'select' },
// options: ['source', 'client'],
// }
// },
render: function Render(args) {
return ()
},
decorators: [
(Story) => (),
]
// Use `fn` to spy on the onClick arg, which will appear in the actions panel once invoked: https://storybook.js.org/docs/essentials/actions#story-args
});
// More on writing stories with args: https://storybook.js.org/docs/writing-stories/args
export const PlayerNoArt = meta.story({
args: {
data: generateSourcePlayerJson()
}
});
export const PlayerWithArt = meta.story({
args: {
data: generateSourcePlayerJson(undefined, {art: true})
}
});
export const PlayerNowPlaying = meta.story({
args: {
data: {...generateSourcePlayerJson(undefined, {art: true}), nowPlayingMode: true }
}
});
export const PlayerNoPosition = meta.story({
args: {
data: {...generateSourcePlayerJson(undefined, {art: true}), position: undefined }
}
});
export const PlayerStartPosition = meta.story({
args: {
data: generateSourcePlayerJson({status: {calculated: 'unknown', reported: 'playing', stale: false, orphaned: false}, position: 0})
}
});
export const PlayerEndPosition = meta.story({
args: {
data: generateSourcePlayerJson({play: asJsonPlayObject(generatePlay({duration: 60})), status: {calculated: 'unknown', reported: 'playing', stale: false, orphaned: false}, position: 60})
}
});
export const PlayerLive = meta.story({
component: ChakraPlayerFetchable,
args: {
platformId: 'test',
componentId: 1,
data: generateSourcePlayerJson({platformId: 'test'}, {art: true})
},
parameters: {
msw: {
handlers: [
http.get<{componentId: string, platformId: string}>(`/api/sources/:componentId/players/:platformId`, async ({ params }) => {
return HttpResponse.json(generateSourcePlayerJson({platformId: params.platformId, position: 10}, {art: true}));
}),
sse('/api/events?next=true', async ({ params, client }) => {
const data = generateSourcePlayerJson({platformId: 'test'}, {art: true});
let position = 10;
let listenedDur = 10;
setInterval(() => {
position += 10;
listenedDur += 10;
client.send({
//@ts-expect-error
event: 'playerUpdate',
data: {componentId: 1, data: {
...data,
playLastUpdatedAt: dayjs().toISOString(),
playerLastUpdatedAt: dayjs().toISOString(),
position,
listenedDuration: listenedDur
}}});
}, 10000);
})
],
},
},
render: function Render(args) {
// @ts-expect-error
return ()
},
decorators: [
(Story) =>
( options={sseProviderOptions}>),
],
});
export const SubsonicPlayer = meta.story({
argTypes: {
playbackReporting: {
control: { type: 'select' },
options: [undefined, false, true],
}
},
args: {
data: generateSourcePlayerJson(undefined, {art: true})
}
});
export const SubsonicPlayerNotEnhanced = meta.story({
argTypes: {
playbackReporting: {
control: { type: 'select' },
options: [undefined, false, true],
}
},
args: {
data: generateSourcePlayerJson(undefined, {art: true, position: false, status: false})
}
});