48 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			48 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| # frozen_string_literal: true
 | |
| 
 | |
| module Status::Visibility
 | |
|   extend ActiveSupport::Concern
 | |
| 
 | |
|   included do
 | |
|     enum :visibility,
 | |
|          { public: 0, unlisted: 1, private: 2, direct: 3, limited: 4 },
 | |
|          suffix: :visibility,
 | |
|          validate: true
 | |
| 
 | |
|     scope :distributable_visibility, -> { where(visibility: %i(public unlisted)) }
 | |
|     scope :list_eligible_visibility, -> { where(visibility: %i(public unlisted private)) }
 | |
|     scope :not_direct_visibility, -> { where.not(visibility: :direct) }
 | |
| 
 | |
|     validates :visibility, exclusion: { in: %w(direct limited) }, if: :reblog?
 | |
| 
 | |
|     before_validation :set_visibility, unless: :visibility?
 | |
|   end
 | |
| 
 | |
|   class_methods do
 | |
|     def selectable_visibilities
 | |
|       visibilities.keys - %w(direct limited)
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   def hidden?
 | |
|     !distributable?
 | |
|   end
 | |
| 
 | |
|   def distributable?
 | |
|     public_visibility? || unlisted_visibility?
 | |
|   end
 | |
| 
 | |
|   alias sign? distributable?
 | |
| 
 | |
|   private
 | |
| 
 | |
|   def set_visibility
 | |
|     self.visibility ||= reblog.visibility if reblog?
 | |
|     self.visibility ||= visibility_from_account
 | |
|   end
 | |
| 
 | |
|   def visibility_from_account
 | |
|     account.locked? ? :private : :public
 | |
|   end
 | |
| end
 |