Improving the Tweet Action Button:

  • we use some new useState() in /twittme-web/src/tweets/components.js

    • purpose is to actionTweet to replace setLikes before ```javascript export function ActionBtn(props) { //const { tweet, action } = props; const { tweet, action, didPerformAction } = props;

    const likes = tweet.likes ? tweet.likes : 0; //new

    //const [likes, setLikes] = useState(tweet.likes ? tweet.likes : 0);

    const className = props.className ? props.className : “btn btn-primary btn-sm”; const actionDisplay = action.display ? action.display : “Action”; //ensure that we have an action

    const handleActionBackendEvent = (response, status) => { console.log(response, status);

    //if (status === 200) { if ((status === 200 || status === 201) && didPerformAction ) {

    1. //setLikes(response.likes);
    2. didPerformAction(response);

    } }; const handleClick = (event) => { event.preventDefault(); apiTweetAction(tweet.id, action.type, handleActionBackendEvent); };

    const display = action.type === “like” ? ${likes} ${actionDisplay} : actionDisplay; return ( ); }

//…

export function Tweet(props) { const { tweet } = props;

//new const [actionTweet, setActionTweet] = useState( props.tweet ? props.tweet : null );

//…

//new const handlePerformAction = (newActionTweet) => { setActionTweet(newActionTweet) };

return (

{tweet.id} - {tweet.content}

{actionTweet && (
)}
); / return (

{tweet.id} - {tweet.content}

);
/ }

  1. - also /Twittme/rest_api/dev.py
  2. ```python
  3. class DevAuthentication(authentication.BasicAuthentication):
  4. def authenticate(self, request):
  5. # qs = User.objects.all()
  6. qs = User.objects.filter(id=1)
  7. user = qs.order_by("?").first()
  8. return (user, None)

to test, runserver and npm start, access localhost:30
The action of like and unlike would be immediately updated.

Corresponding to retweet:

  1. export function ActionBtn(props) {
  2. const { tweet, action, didPerformAction } = props;
  3. const likes = tweet.likes ? tweet.likes : 0;
  4. const className = props.className
  5. ? props.className
  6. : "btn btn-primary btn-sm";
  7. const actionDisplay = action.display ? action.display : "Action"; //ensure that we have an action
  8. const handleActionBackendEvent = (response, status) => {
  9. console.log(response, status);
  10. if ((status === 200 || status === 201) && didPerformAction) {
  11. //didPerformAction(response);
  12. didPerformAction(response, status);
  13. }
  14. };
  15. //...
  16. }
  17. export function Tweet(props) {
  18. const { tweet } = props;
  19. const [actionTweet, setActionTweet] = useState(
  20. props.tweet ? props.tweet : null
  21. );
  22. const className = props.className
  23. ? props.className
  24. : "col-10 mx-auto col-md-6";
  25. //const handlePerformAction = (newActionTweet) => {
  26. const handlePerformAction = (newActionTweet, status) => {
  27. //setActionTweet(newActionTweet);
  28. if (status === 200) {
  29. setActionTweet(newActionTweet);
  30. } else if (status === 201) {
  31. //let the tweet list know
  32. }
  33. };
  34. //...
  35. }