Black November

ATÉ 50% OFF

TÁ ACABANDO!

0 dias

0 horas

0 min

0 seg

2
respostas

[Sugestão] Problemas com componentes no blazor para playlist

Olá a todos. Caso voces tenham problemas com a barra de tempo, e os icones como o css do bootstrap, segue o codigo de uma forma de tentar fazer um pouco mais "caprichado"

componente blazor

@page "/playlist"
@inject MusicasAPI musicasAPI
@implements IDisposable

<h2>Playlist</h2>

<div class="playlist-container d-flex align-items-center mb-4 p-3 bg-dark text-bg-dark rounded">
    <img src="images/cardArtista.png" class="playlist-cover me-4" alt="">
    <div>
        <h3 class="mb-1">Minha Playlist Favorita</h3>
        <p class="text-white mb-2">Uma seleção das melhores músicas para você curtir!</p>
        <span class="badge bg-primary">Pública</span>
    </div>
</div>

@if (musicas != null)
{
    <div class="playlist-tracks bg-light rounded p-3">
        <table class="table table-hover align-middle mb-0">
            <thead>
                <tr>
                    <th></th>
                    <th>Número</th>
                    <th>Música</th>
                    <th>Artista</th>
                    <th>Ano Lançamento</th>
                </tr>
            </thead>
            <tbody>
                @foreach (var musica in musicas)
                {
                    var isPlaying = musica.Id == musicaTocandoID;
                    <tr class="playlist-item @(isPlaying ? "playing-row" : null)"
                    @onclick="() => AlternarPlay (musica.Id) ">
                        <td>
                            <i class="bi @(isPlaying ? "bi-stop-fill" : "bi-play-fill")"></i>
                        </td>
                        <td>@musica.Id</td>
                        <td>
                            <div>@musica.Nome</div>
                            @if (isPlaying)
                            {
                                <div class="progress-bar-container">
                                    <div class="progress-bar" style="width: @(progresso)%; transition: width 0.5s linear;"></div>
                                </div>
                            }
                        </td>
                        <td>@musica.NomeArtista</td>
                        <td>@musica.AnoLancamento</td>
                    </tr>
                }
            </tbody>
        </table>
    </div>
}
else
{
    <p>Carregando...</p>
}

@code {
    private int? musicaTocandoID;
    private ICollection<MusicaResponse>? musicas;
    private double progresso = 0; // Progresso da música em porcentagem
    private CancellationTokenSource? cancellationTokenSource; // Para controlar o cancelamento do progresso

    protected override async Task OnInitializedAsync ()
    {
        musicas = await musicasAPI.GetMusicaAsync();
    }

    //vai cuidar do controle de musicas que estariam tocando
    private async Task AlternarPlay(int musicaId)
    {
        if (musicaTocandoID == musicaId)
        {
            musicaTocandoID = null;
            cancellationTokenSource?.Cancel(); // cancela o progresso
            progresso = 0;
        }
        else
        {
            cancellationTokenSource?.Cancel();
            
            musicaTocandoID = musicaId;
            progresso = 0;
            cancellationTokenSource = new CancellationTokenSource();
            
            try
            {
                int duracao = 15000;
                int intervalo = 150;
                int passos = duracao / intervalo;
                
                for (int i = 0; i <= passos; i++)
                {
                    if (cancellationTokenSource.Token.IsCancellationRequested)
                        break;
                        
                    progresso = (i * 100.0) / passos;
                    StateHasChanged();
                    await Task.Delay(intervalo, cancellationTokenSource.Token);
                }
                
                if (musicaTocandoID == musicaId && !cancellationTokenSource.Token.IsCancellationRequested)
                {
                    musicaId++;
                    progresso = 0;
                    await AlternarPlay(musicaId);
                }
            }
            catch (TaskCanceledException)
            {
                progresso = 0;
            }
        }
    }
    
    // Implementação do IDisposable para cancelar o token quando o componente for descartado
    public void Dispose()
    {
        cancellationTokenSource?.Cancel();
        cancellationTokenSource?.Dispose();
    }
}

voce precisa importar a biblioteca do bootstrap no index
parte do head de como ele deveria estar

<head>
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.css" /> <!--  add esta linha dentro do head-->
</head>

Matricule-se agora e aproveite até 50% OFF

O maior desconto do ano para você evoluir com a maior escola de tecnologia

QUERO APROVEITAR
2 respostas

no css, voce pode seguir com as duvidas já abertas, mas voce precisa adicionar uns componentes faltantes como

tr.playlist-item {
    vertical-align: middle;
}

tr.playlist-item {
    cursor: pointer;
}

.bi-play-fill {
    color: transparent;
    font-size: 1.2rem;
}

tr:hover .bi-play-fill {
    color: black;
}

.bi-stop-fill {
    color: red;
    font-size: 1.2rem;
}

/* Estilo para a linha que está tocando */
tr.playing-row {
    background-color: rgba(29, 185, 84, 0.2);
    position: relative;
}

tr.playing-row td:first-child::before {
    content: '';
    position: absolute;
    left: 0;
    top: 0;
    bottom: 0;
    width: 4px;
    background-color: #1db954;
    animation: pulse 1.5s infinite;
}

isso pode te ajudar a resolver os problemas que eu tive para criar o componente. Claro, eu não manjo em CSS e bootstrap, mas o Sonnet ajudará voce bastante.

Oi, João! Como vai?

Agradeço por compartilhar.

Gostei da forma como você detalhou a solução no Blazor e mostrou pontos úteis para quem estiver enfrentando os mesmos desafios. Do jeito que você explicou, fica bem mais simples entender o comportamento do componente e ajustar o CSS conforme necessário.

Continue compartilhando essas melhorias, isso fortalece muito a troca no fórum.

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!