Emoji mention theme component

This is a simple component that will automatically add an emoji (or other text, if you’d like) to a @mention in a post

40%20AM

Github repo: https://github.com/awesomerobot/discourse-emoji-mention

How do I install a Theme or Theme Component?

How to

To configure it, add items to the list in the format of @username, emoji (You can copy and paste emoji from https://getemoji.com/ or https://emojipedia.org/)

41%20AM

There’s also an option to show the emoji after the mention, instead of before.

That’s all it does!

29 curtidas

Would be possible to use this with custom emojis?
As we provide support from our community, it would be nice to add our logo before mentioning one of the staff

1 curtida

Not using the current structure because the setting uses unicode for emojis.

1 curtida

Mmm, and maybe it could be changed? :sweat_smile:

This component is kind of a super basic template on finding content in a post and appending something to it. There’s probably a way to grab existing emojis, but I don’t know it off the top of my head.

What would work is replacing the header.html file in the component with this, which would just append an image after a mention instead (that image could be a little logo).

<script type="text/discourse-plugin" version="0.8.18">
    $.expr[":"].contains = $.expr.createPseudo(function(arg) { // make case insensitive
        return function( elem ) {
            return $(elem).text().toUpperCase().indexOf(arg.toUpperCase()) >= 0;
        };
    }); 
    
    let emoji = {};
    
    settings.username_emoji.split('|').forEach(pair => {
        let split = pair.split(",");
        emoji[split[0].toLowerCase()] = split[1];
    });
    
    $.each(emoji, function (key, value){
        api.decorateCooked($elem => $elem.find("a.mention:contains(" + key + ")").append("<img src='" + value + "'>").addClass("with-image"));
    });
    
</script> 

Using a setting like this

11 curtidas

Eu realmente gosto desse conceito!

Duas coisas que me vêm à mente, não tenho certeza se são possíveis atualmente, mas o que eu adoraria ter:

  1. A capacidade de usar isso para menções de grupo? Acabei de tentar para o meu grupo de administradores, mas não pareceu funcionar.

  2. A capacidade de o usuário escolher seu próprio emoji em suas preferências e, em seguida, ele apareceria toda vez que fosse mencionado. Talvez pudesse até ser um benefício para dar a usuários mais engajados em níveis de confiança mais altos.

Editar:

  1. A capacidade de usar isso para menções de grupo? Acabei de tentar para o meu grupo de administradores, mas não pareceu funcionar.

Descobri como fazer isso, mas não sei como fazer uma solicitação de PR, então, por enquanto, postarei o código abaixo:

common.scss adiciona .mention-group:after e .mention-group:before

@if $show-after-mention == "true" {
  .mention:after,
  .mention-group:after {
    content: attr(data-emoji);
    display: inline;
  }
} @else {
  .mention:before,
  .mention-group:after {
    content: attr(data-emoji);
    display: inline;
  }
}

header.html adiciona isso ao final:

$.each(emoji, function(key, value) {
  api.decorateCooked($elem =>
    $elem
      .find("a.mention-group:contains(" + key + ")")
      .attr("data-emoji", value)
      .addClass("with-emoji")
  );
});
1 curtida

Eu queria a capacidade de usar também SVGs personalizados como ícone ao lado de uma menção, algo que vi no Guilded para a equipe e que eu queria ter lá, mas não conseguia — mais um motivo pelo qual estou gostando tanto do Discourse é que posso realmente criar algo que funcione em vez de esperar que os desenvolvedores o adicionem.

Então, criei a seguinte solução. Não é infalível de forma alguma, provavelmente requer que o SVG que você carrega tenha uma variável SCSS que comece com svg e, ainda assim, parece funcionar o suficiente para mim agora :slight_smile:

Se alguém quiser pegar este código e desenvolvê-lo, incorporá-lo para torná-lo mais sofisticado, ficaria grato!

Possíveis melhorias

  1. Fazer com que funcione para todos os ícones SVG, ou seja, todos os do Discourse e todos os que são carregados e não começam com svg.
  2. Limpar o código.
  3. Melhorar o estilo, pois eu meio que criei o CSS para funcionar e pode não funcionar em todas as situações.

Independentemente disso, aqui está um exemplo de uma menção comigo usando o ícone personalizado que tenho para Defesa Emocional como ícone de menção da equipe:

image

Aqui está o código que adicionei:

header.html

  // Adiciona ícones SVG como uma opção, desde que estejam incluídos nos assets e carregados
  // Cria um objeto de todos os assets e itera para encontrar quais links têm o atributo data-emoji
  // igual ao nome da variável do asset e, em seguida, adiciona o URL para ele

  // converte o objeto em um array de chaves
  const keys = Object.keys(settings.theme_uploads);

  // imprime todas as chaves
  console.log(keys);

  // itera sobre o objeto
  keys.forEach((key, index) => {
      console.log(`${key}: ${settings.theme_uploads[key]}`);
      api.decorateCooked($elem => {
        var url = settings.theme_uploads[key];
        console.log("key: " + key);
        console.log("index: " + index);
        console.log("url: " + url);
        console.log(JSON.stringify(settings.theme_uploads));
        $elem
          .find("a[data-emoji^='" + key + "']")
          .css("--svg-icon", "url('" + url + "')");
        }
      );    
  });

common.scss

@if $show-after-mention == "true" {
  [data-emoji^="svg"]:after {
    content: 'hey ';
    color: transparent;
    height:5px;
    width:15px;
    background: var(--svg-icon) no-repeat center;
    background-size: contain;
    display: inline;
  }
} @else {
  [data-emoji^="svg"]:before {
    content: 'hey ';
    color: transparent;
    height:5px;
    width:15px;
    background: var(--svg-icon) no-repeat center;
    background-size: contain;
    display: inline;
  }
}

Isso também requer que você:

  1. Crie uma pasta /assets
  2. Adicione arquivos svg na pasta /assets, como /assets/esd-heart.svg
  3. Atualize o arquivo about.json para vincular esses assets com algo como:
"assets": {
  	"svg_esd_heart": "assets/esd-heart.svg"
}
1 curtida

Existe alguma maneira de o emoji aparecer apenas para o usuário escolhido? Se você tiver um usuário com o nome Taylor e TaylorLife, o emoji aparece para ambos.